如何将2个Arraylists合并为1按字母顺序排序

时间:2017-03-02 16:52:33

标签: java

我一直在尝试将已经按字母顺序排序的两个字符串arraylists合并为一个大字符串,这个字符串也按字母顺序排序。优选使用一个循环完成,但两个也很好。此外,必须使用comapreTo方法来比较字符串。这就是我所拥有的,但它不起作用。你可能最好重新开始,因为这可能不是很好。

public static ArrayList<String> merge(ArrayList<String> al1, ArrayList<String> al2){
     ArrayList<String> result = new ArrayList<String>();

     int longLength = al1.size() > al2.size() ? al1.size():al2.size();

            for(int i=0;i<longLength;i++){
            if(al1.size() > i && al2.size() > i && al1.get(i).compareTo(al2.get(i)) >= 0){
            result.add(al2.get(i));
            } 
            else if(al1.size() > i && al2.size() > i && al1.get(i).compareTo(al2.get(i)) < 0) {
            result.add(al1.get(i));
            } 
            else if(al1.size() > i && al2.size() <= i) {
            result.add(al1.get(i));
            } 
            else if(al1.size() <= i && al2.size() > i) {
            result.add(al2.get(i));
            }
        }
     return result;
  }

2 个答案:

答案 0 :(得分:3)

使用addAll()将list2的所有元素添加到list1,然后使用实用程序类Collections

对它们进行排序
  • addAll()将list2的所有元素追加到list1的末尾。

  • Collections.sort()根据元素的自然顺序将指定列表按升序排序

示例:

public class Main {
    public static void main(String[] args) {
        List<String> list1 = new ArrayList<>();
        list1.add("a");
        list1.add("c");

        List<String> list2 = new ArrayList<>();
        list2.add("b");

        list1.addAll(list2);// the order is "a" "c" "b" now
        Collections.sort(list1);

        for(String e: list1){
            System.out.println(e);
        }
    }
}

输出:

a
b
c

答案 1 :(得分:1)

只需抓住每个列表开头的元素,然后将它们添加到排序列表中。当任何列表不在元素中时,只需添加添加其他列表的所有元素。

示例代码。请注意,list.remove(0)对于ArrayList是O(n),弹出可以通过保留两个索引变量来完成。我把它留给你来完成你的作业!

List<String> result = new ArrayList<>(list1.size() + list2.size());
while( !list1.isEmpty() && !list2.isEmpty()){
    if( list1.get(0).compareTo(list2.get(0)) < 0){
        result.add(list1.remove(0));
    } else {
        result.add(list2.remove(0));
    }
}

if( list1.isEmpty()){
    result.addAll(list2);
} else{
    result.addAll(list1);
}