【问题标题】:How can I merge two lexicographically ordered String ArrayLists into a new third ArrayList?如何将两个按字典顺序排列的 String ArrayList 合并到新的第三个 ArrayList 中?
【发布时间】:2016-08-05 10:28:51
【问题描述】:

如何在不修改两个原始列表的情况下将两个按字典顺序排列的 String ArrayList 合并到新的第三个 ArrayList 中?例如,允许重复。如果list1是:1、3、5,list2是:2、4、7、8、8。那么新合并的list3应该是:1、2、3、4、5、7、8、8。我需要创建 2 个 while 循环,第一个循环一直持续到整个列表,第二个循环从另一个列表中取出剩余元素,并将所有剩余元素放在新列表的末尾3。我基本上需要比较两个列表索引以查看哪个元素前进。一切都应该是正确的,但我需要帮助来制作 while 循环。

抱歉,描述太长了,但我会投票给任何有帮助的人!谢谢!

public class Merge{
    public static boolean isStringArrayListSorted(ArrayList<String> data) {
        for (int i = 1; i < data.size(); i++) {
            if (data.get(i - 1).compareTo(data.get(i)) > 0) {
                return false;
            }
        }
        return true;
    }

    public Merge (ArrayList<String> list1, ArrayList<String> list2){

        ArrayList<String> list3 = new ArrayList<String>();

    list1.add(0, "a");
    list1.add(1, "c");
    list1.add(2, "e");
    list1.add(3, "g");

    list2.add(0, "b");
    list2.add(1, "d");
    list2.add(2, "f");
    list2.add(3, "h");
    list2.add(4, "i");
    list2.add(5, "j");

    while(list1!= null){
        if(list1.get(0)> list2.get(0))
        {
            list3.add(index, element);
        }
    }
}

【问题讨论】:

  • fyi,您不需要列表 add() 调用中的索引,单个参数 add() 方法附加到末尾。

标签: java arraylist while-loop merge lexicographic


【解决方案1】:

假设您真的想要进行合并而不是将两者合并并再次排序,它的简单合并代码如下:

public static ArrayList<String> merge(ArrayList<String> L1, ArrayList<String> L2) {
    int i1 = 0, i2 = 0;
    ArrayList<String> result = new ArrayList<String>();

    while (i1 < L1.size() && i2 < L2.size()) {
        if (L1.get(i1).compareTo(L2.get(i2)) < 0) {
            result.add(L1.get(i1));
            i1++;
        } else {
            result.add(L2.get(i2));
            i2++;
        }
    }

    while (i1 < L1.size()) {
        result.add(L1.get(i1));
        i1++;
    }

    while (i2 < L2.size()) {
        result.add(L2.get(i2));
        i2++;
    }

    return result;
}

【讨论】:

  • ArrayList 实现了 AbstractList 允许随机访问中间的元素,而 LinkedList 实现 AbstractSequentialList (它扩展了 AbstractList )只强加了一个额外的“顺序访问”。在我的代码中,我没有在中间操作条目,因此 ArrayList 仍将保留顺序。
【解决方案2】:

为什么不使用Collections.sort()

ArrayList<String> list3 = new ArrayList<String>(list1);
list3.addAll(list2);
Collections.sort(list3);

【讨论】:

  • 好吧,我想创建一个算法,通过比较索引来确定哪个元素进入新列表。
  • 现在 CPU 非常快,因此与 O(n) 合并相比,O(n log n) 排序可能不值得关注[假设获得初始排序没有成本列表]。所以... ^_^
【解决方案3】:

我建议在这里使用Collections.sort ()。只需创建一个新列表,添加所有元素并对其进行排序。该命令会更短,更易读,并且您将使用内置排序算法的高性能。

【讨论】:

    猜你喜欢
    • 2015-10-28
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2017-08-28
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    相关资源
    最近更新 更多