【问题标题】:How to swap two SubLists from ArrayList?如何从 ArrayList 交换两个子列表?
【发布时间】:2019-09-15 14:16:52
【问题描述】:
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方法,它合并了两个ArrayLists和subList方法,它返回了ArrayList的一部分。

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

使用sorted方法就够了,但是不知道怎么写才能正确排序。

请帮忙

谢谢

【问题讨论】:

  • 我无法理解您的问题。如果您希望循环从 21 开始,请将 i = 1 更改为 i = 21。如果你想拆分一个 ArrayList,这已经在 Stack Overflow 上介绍过很多次了。如果你想对 List 进行排序,那也已经被介绍过很多次了。但我不知道你真正想要的什么。投票结束,因为不清楚。
  • 为什么是 JavaFX 标签?
  • @Basil Bourque 我删除了标签。是的你是对的。我只是不知道要寻找什么。只有在写问题的时候我才意识到我应该使用sorted 方法。但是,@Udith Gunaratna 用户准确地表达了我想要的。

标签: java sorting arraylist sublist


【解决方案1】:

基本上在对比较器进行排序时,您会得到 2 个数字(比如说 n1 和 n2),然后根据返回值对它们进行排序。

  • 如果返回负值,n1 排在n2 之前
  • 如果返回正值,n2 排在n1 之前
  • 如果返回0,则两者按顺序被视为相等

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

  • 如果n1 和n2 都在同一个区域(在0-19 或20-100 之间),照常对它们进行排序
  • 如果n1和n2在不同的地区,则将属于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());

【讨论】:

  • 这就是我想要的。非常感谢。
猜你喜欢
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 2018-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
相关资源
最近更新 更多