如何将 Set<Set<Integer>> 复制到 Java 中的 List<Integer[]>?
How to copy a Set<Set<Integer>> into a List<Integer[]> in Java?
我想将一个 Set<Set<Integer>>
数组复制到一个 Integer[] 列表。我想这样做是因为我想在每个数组的第一个元素为 0 时更改它,并将其放在末尾。
我设法做到了,但是在 List 中,当循环 throw 时,我无法进行更改,因为数组仍然是一个 Set。
没有其他问题可以清楚地说明这一点,相反,他们在我们只有 Set<SomeWrapperClass>
时进行了解释
也许还有其他解决方案?备注:我无法更改 Set<Set<Integer>>
我的设置:
Set<Set<Integer>> indexs = new HashSet<>();
我只能这样转成List:
List<Set<Integer>> arrangedIndexOfCourses = new ArrayList<>();
static Set<Set<Integer>> coursesIndex = Sets.powerSet(Sets.newHashSet(1, 2, 3, 4, 5, 6, 7, 8, 9, 0));
static List<Set<Integer>> arrangedIndexOfCourses = new ArrayList<>();
以下方法return所有从0123456789(番石榴库)制作的唯一编号
private void indexSet(Set<Set<Integer>> coursesIndex) {
Set<Set<Integer>> indexs = new HashSet<>();
for (Set<Integer> token : coursesIndex) {
indexs.add(token);
arrangedIndexOfCourses.add(token);
count++;
}
}
以及我尝试更改数组的第一个 0 并放在最后的代码:
for (Set<Integer> i : arrangedIndexOfCourses) {
if (i.contains(0)) {
Collections.rotate(arrangedIndexOfCourses, -1);
}
}
看来,这个任务的主要技巧是如何实现第一个元素为0的旋转。
如评论中所述,并非所有类型的集合都保持顺序,因此具有“第一个”元素。但是在将集合转换为流后,即使 HashSet
流中也有第一个元素,除非它为空。
因此,整数集合的集合可以转换为整数数组列表,如下所示:
- 使用
limit
或findFirst
获取流的第一个元素
- 与0比较,需要的话放在最后
- 否则保持集流不变
Set<Set<Integer>> data = Set.of(
Collections.emptySet(),
new LinkedHashSet<>(Arrays.asList(0, 1, 2, 3)),
new LinkedHashSet<>(Arrays.asList(4, 5, 6)),
new LinkedHashSet<>(Arrays.asList(10, 0, 100, 1000)),
new TreeSet<>(Arrays.asList(25, 0, 1, 16, 4, 9)),
new HashSet<>(Arrays.asList(0, 5, 50))
);
List<Integer[]> rotatedZeros = data
.stream()
.map(s ->
(s.stream().findFirst().orElse(-1) == 0 // or limit(1).findAny()
? Stream.concat(s.stream().skip(1), Stream.of(0))
: s.stream())
.toArray(Integer[]::new)
)
.collect(Collectors.toList());
rotatedZeros.stream().map(Arrays::toString).forEach(System.out::println);
输出:
[]
[4, 5, 6]
[1, 2, 3, 0]
[10, 0, 100, 1000]
[1, 4, 9, 16, 25, 0]
[50, 5, 0]
使用 lambda w/o 外部库的两步解决方案
(1) 将 Set<Set<Integer>>
转换为 List<Integer[]>
List<Integer[]> arrangedIndexOfCourses = coursesIndex.stream()
.map(s -> s.toArray(Integer[]::new)).collect(toList());
(2) 遍历数组并以传统方式更改 零数组
for (Integer[] indices : arrangedIndexOfCourses) {
if (indices.length > 0 && indices[0] == 0) {
for (int i = 0; i < indices.length - 1; i++)
indices[i] = indices[i + 1];
indices[indices.length - 1] = 0;
}
}
基于 Alex 令人惊叹的解决方案的 lambda
将零旋转的东西向上游移动使 lambda 更少 trickier 并且您可以使用集合而不是数组
List<Integer[]> arrangedIndexOfCourses = coursesIndex.stream()
.map(s -> {
if (s.stream().findFirst().orElse(-1) == 0) {
List<Integer> l = new ArrayList<>();
l.addAll(s);
l.remove(0);
l.add(0);
return l.toArray(Integer[]::new);
} else
return s.toArray(Integer[]::new);
}).collect(toList());
我想将一个 Set<Set<Integer>>
数组复制到一个 Integer[] 列表。我想这样做是因为我想在每个数组的第一个元素为 0 时更改它,并将其放在末尾。
我设法做到了,但是在 List
没有其他问题可以清楚地说明这一点,相反,他们在我们只有 Set<SomeWrapperClass>
也许还有其他解决方案?备注:我无法更改 Set<Set<Integer>>
我的设置:
Set<Set<Integer>> indexs = new HashSet<>();
我只能这样转成List:
List<Set<Integer>> arrangedIndexOfCourses = new ArrayList<>();
static Set<Set<Integer>> coursesIndex = Sets.powerSet(Sets.newHashSet(1, 2, 3, 4, 5, 6, 7, 8, 9, 0));
static List<Set<Integer>> arrangedIndexOfCourses = new ArrayList<>();
以下方法return所有从0123456789(番石榴库)制作的唯一编号
private void indexSet(Set<Set<Integer>> coursesIndex) {
Set<Set<Integer>> indexs = new HashSet<>();
for (Set<Integer> token : coursesIndex) {
indexs.add(token);
arrangedIndexOfCourses.add(token);
count++;
}
}
以及我尝试更改数组的第一个 0 并放在最后的代码:
for (Set<Integer> i : arrangedIndexOfCourses) {
if (i.contains(0)) {
Collections.rotate(arrangedIndexOfCourses, -1);
}
}
看来,这个任务的主要技巧是如何实现第一个元素为0的旋转。
如评论中所述,并非所有类型的集合都保持顺序,因此具有“第一个”元素。但是在将集合转换为流后,即使 HashSet
流中也有第一个元素,除非它为空。
因此,整数集合的集合可以转换为整数数组列表,如下所示:
- 使用
limit
或findFirst
获取流的第一个元素
- 与0比较,需要的话放在最后
- 否则保持集流不变
Set<Set<Integer>> data = Set.of(
Collections.emptySet(),
new LinkedHashSet<>(Arrays.asList(0, 1, 2, 3)),
new LinkedHashSet<>(Arrays.asList(4, 5, 6)),
new LinkedHashSet<>(Arrays.asList(10, 0, 100, 1000)),
new TreeSet<>(Arrays.asList(25, 0, 1, 16, 4, 9)),
new HashSet<>(Arrays.asList(0, 5, 50))
);
List<Integer[]> rotatedZeros = data
.stream()
.map(s ->
(s.stream().findFirst().orElse(-1) == 0 // or limit(1).findAny()
? Stream.concat(s.stream().skip(1), Stream.of(0))
: s.stream())
.toArray(Integer[]::new)
)
.collect(Collectors.toList());
rotatedZeros.stream().map(Arrays::toString).forEach(System.out::println);
输出:
[]
[4, 5, 6]
[1, 2, 3, 0]
[10, 0, 100, 1000]
[1, 4, 9, 16, 25, 0]
[50, 5, 0]
使用 lambda w/o 外部库的两步解决方案
(1) 将 Set<Set<Integer>>
转换为 List<Integer[]>
List<Integer[]> arrangedIndexOfCourses = coursesIndex.stream()
.map(s -> s.toArray(Integer[]::new)).collect(toList());
(2) 遍历数组并以传统方式更改 零数组
for (Integer[] indices : arrangedIndexOfCourses) {
if (indices.length > 0 && indices[0] == 0) {
for (int i = 0; i < indices.length - 1; i++)
indices[i] = indices[i + 1];
indices[indices.length - 1] = 0;
}
}
基于 Alex 令人惊叹的解决方案的 lambda
将零旋转的东西向上游移动使 lambda 更少 trickier 并且您可以使用集合而不是数组
List<Integer[]> arrangedIndexOfCourses = coursesIndex.stream()
.map(s -> {
if (s.stream().findFirst().orElse(-1) == 0) {
List<Integer> l = new ArrayList<>();
l.addAll(s);
l.remove(0);
l.add(0);
return l.toArray(Integer[]::new);
} else
return s.toArray(Integer[]::new);
}).collect(toList());