如何将 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 流中也有第一个元素,除非它为空。

因此,整数集合的集合可以转换为整数数组列表,如下所示:

  1. 使用limitfindFirst
  2. 获取流的第一个元素
  3. 与0比较,需要的话放在最后
  4. 否则保持集流不变
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());