如何通过出现某事来分割ArrayList?

时间:2017-08-28 10:31:13

标签: java list arraylist collections

我有以下ArrayList

List<Integer> l = new ArrayList<Integer>(Arrays.asList(1,2,3,4,1,2,3,1,2,3,4,5,6));

那么它将是

[1,2,3,4,1,2,3,1,2,3,4,5,6]

现在我希望在下一次出现1时将列表拆分为subl ist 所以输出将是

[[1,2,3,4],[1,2,3],[1,2,3,4,5,6]]

如何做到这一点?列表列表

List<List<Integer>> ll = new ArrayList<List<Integer>>();

我的尝试是

ListIterator<Integer> li = steps.listIterator();
List<List<Integer>> fl = new ArrayList<List<Integer>>();
List<Integer> l = new ArrayList<Integer>();

while (li.hasNext()) {

    if (li.next() == 1) {
        l.add(li.next());
    }

    fl.add(l);
}

2 个答案:

答案 0 :(得分:0)

当您调用iterator.next()时,迭代器中的游标将在下一个位置移动。您可以在不使用iterator仅使用foreach循环的情况下重写算法,以避免光标移动时出错。

例如:

    List<Integer> originalList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 1, 1, 2, 3, 1, 2, 3, 4, 5, 6));
    List<List<Integer>> finalList = new ArrayList<>();
    List<Integer> currentList = new ArrayList<>();
    for (Integer current : originalList) {
        if (current == 1) {
            if (!currentList.isEmpty()) {
                finalList.add(currentList);
            }
            currentList = new ArrayList<>();
        }
        currentList.add(current);
    }
    if (!currentList.isEmpty()) {
         finalList.add(currentList);
    }

或者,如果你有带有StreamEx Library的java 8,你可以更容易:

   List<List<Integer>> streamExList = StreamEx.of(originalList)
            .groupRuns((first, second) -> second != 1)
            .collect(Collectors.toList());

答案 1 :(得分:0)

我正在使用 ArrayList subList 方法来创建新的 ArrayList

工作代码如下:

  List<Integer> steps = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4, 5, 6));
            ListIterator<Integer> li = steps.listIterator();
            List<List<Integer>> fl = new ArrayList<List<Integer>>();
            List<Integer> indexes = new ArrayList<>();
            while (li.hasNext()) {
                  if (li.next() == 1) {
                        indexes.add(li.nextIndex() - 1);
                  }
            }
            for (int i = 0; i < indexes.size(); i++) {
                  if (indexes.size() - 1 != i) {
                        fl.add(steps.subList(indexes.get(i), indexes.get(i + 1)));
                  } else {
                        fl.add(steps.subList(indexes.get(i), steps.size()));
                  }
            }
            System.out.println(fl);

是的,我在这里使用名为索引的新列表,添加查找位置的索引很有用。在这里,OfCourse我在新列表(索引)中分配的索引需要 -1 ,所以我编辑

注意:

您在循环中使用了以下代码:

if (li.next() == 1) {
        l.add(li.next());
    }

这有两次 li.next(),最好将其分配给某个变量。它确实意味着如果你在你的循环中使用多次 li.next(),指针将移动到下一个位置,你不会得到你想要的结果,你可能遇到的运行时异常是的 NoSuchElementException异常