如何从 ArrayList 交换两个子列表?

How to swap two SubLists from ArrayList?

var numbers = new ArrayList<Integer>(100);
for (var i = 1; i <= 100; i++) {
    numbers.add(i);
}

这是一串数字(仅供举例) 但是,它以错误的数字开头。 我需要它以 21 开头,而不是 1。 修改循环会不必要地复杂。将 ArrayList 分成两个 List 并交换它们更容易。

numbers = Stream.concat(numbers.subList(20, 100).stream(), numbers.subList(0, 20).stream()).collect(Collectors.toCollection(ArrayList::new));

我使用了concat方法,它合并了两个ArrayListssubList方法,returns是ArrayList的一部分。

但是,创建一个仅顺序不同的新 ArrayList 是不合逻辑的。

sorted方法就可以了,就是不知道怎么写才能正确排序

请帮忙

谢谢

基本上在对比较器进行排序时,您会得到 2 个数字(假设 n1n2),并根据 return 值对它们进行排序。

  • 如果 returned 为负值,n1 排在 n2
  • 之前
  • 如果 returned 为正值,则 n2 排在 n1
  • 之前
  • 如果 0 被 return 编辑,则两者在顺序上被认为是相等的

牢记这一点,您可以编写排序比较器以提供以下行为。

  • 如果 n1n2 都在同一区域(在 0-1920-100 之间),则照常对它们进行排序
  • 如果n1n2在不同的地区,则将属于20-100的号码(两者中较大的号码)排在另一个

示例代码,

numbers =
    (ArrayList<Integer>)
            numbers.stream()
                    .sorted((n1, n2) -> {
                        if (((n1 >= 21) && (n2 >= 21)) || ((n1 <= 20) && (n2 <= 20))) {
                            return  n1 - n2;
                        } else {
                            return n2 - n1;
                        }
                    }).collect(Collectors.toList());