【问题标题】:Sorting and swapping elements in two ArrayLists (Java)在两个 ArrayLists (Java) 中对元素进行排序和交换
【发布时间】:2013-10-07 14:26:56
【问题描述】:

我是 Java 新手...

我有两个 ArrayList:

subList1
subList2

它们已被另一种方法填充,并且在运行时,列表包含以下字符串:

subList1: [amulet, map, stone, sword]
subList2: [bottle, shield, wand]

我需要做的是对两个列表进行排序,以便 subList1 包含所有按字母顺序排列的小于 subList2 中元素的元素。此外,两个列表大小必须保持不变。

预期输出:

subList1: [amulet, bottle, map, shield]
subList2: [stone, sword, wand]

到目前为止我的代码:

Collections.sort(subList1);
Collections.sort(subList2);

    //[amulet, map, stone, sword]
    //[bottle, shield, wand]

    for (int i1 = 0; i1 < subList1.size(); i1++) {

        for (int i2 = 0; i2 < subList2.size(); i2++) {

        if (subList1.get(i1).compareTo(subList2.get(i1)) < 0) {

            // first run: element 0: subList1 = amulet, subList2 = bottle

            String temp = subList1.get(i1);
            subList1.set(i1, subList2.get(i1));
            subList2.set(i1, subList1.get(i1));  

我还得到以下行的 IndexOutOfBoundsException:

if (subList1.get(i1).compareTo(subList2.get(i1)) < 0)

非常感谢任何帮助。谢谢。

【问题讨论】:

  • 您得到的例外是因为您使用i1 代替subList2,我认为它没有i1 元素。
  • 感谢您指出这一点。很有帮助。

标签: java sorting arraylist swap


【解决方案1】:

您将两个列表分开排序,然后对它们进行迭代,从而使您的任务复杂化。我建议您遵循这种方法:

  • 合并两个列表以创建newList = subList1 + subList2
  • 排序newList
  • newList的末尾获取等于subList2长度的子列表。
  • newList的开头获取等于subList1长度的子列表

工作代码:

Collection<String> subList1 = Arrays.asList("amulet", "map", "stone", "sword");
Collection<String> subList2 = Arrays.asList("bottle", "shield", "wand");

// Merge two collection in a single list    
List<String> mergedList = new ArrayList<>(subList1);
mergedList.addAll(subList2);

Collections.sort(mergedList);

// Assign subList from mergedList back to original Collection reference
subList1 = mergedList.subList(0, subList1.size());
subList2 = mergedList.subList(subList1.size(), mergedList.size());

System.out.println(subList1);  // [amulet, bottle, map, shield]
System.out.println(subList2);  // [stone, sword, wand]

【讨论】:

  • 非常感谢。正是我所追求的。非常感谢。
【解决方案2】:

你有什么(不正确)

if (subList1.get(i1).compareTo(subList2.get(i1)) < 0) 

应该是什么(正确)

if (subList1.get(i1).compareTo(subList2.get(i2)) < 0) // you wrote i1 instead of i2
                                           _____

【讨论】:

  • li.size()&gt; l2.size()时仍然是IOBE问题
  • 感谢您的回复。
【解决方案3】:

合并两个列表:

List<String> merged = new ArrayList<String>();
merged.addAll(subList1);
merged.addAll(subList2);

对合并后的列表进行排序:

Collections.sort(merged);

获取subList1的大小:

int k = subList1.size();

清除合并列表中从0到k的条目并添加到subList1中:

subList1.clear();
subList1.addAll(merged.subList(0, k));

清除合并列表中从 k 到 n 的条目并将其添加到 subList2 中(其中 n 是合并列表的大小):

subList2.clear();
subList2.addAll(merged.subList(k, merged.size()));

【讨论】:

  • 最后我实际上使用了其中的一部分,所以谢谢你的回复。我接受了基于他先回答的其他答案。
【解决方案4】:

这将修复您的异常: if (subList1.get(i1).compareTo(subList2.get(i2))

要对两个列表进行排序,您需要获取第一个列表的大小。 (即 int len = subList1.length()),将它们合并在一起,排序,然后根据您首先保存的 'len' 变量将其拆分为 2。

可能是这样的:

int length = subList1.length();
subList1.addAll(subList2); // add both lists together
Collections.sort(subList1); // sort

// split them both up again
subList2 = subList1.subList(length, subList1.length());
subList1 = subList1.subList(0, length);

这可以通过多种方式进行整理,但应该为您提供一个很好的起点。长度变量是不必要的(我们知道 subList 2 的长度),但便于阅读代码。

【讨论】:

  • li.size()&gt; l2.size()时仍然是IOBE问题
  • 感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多