Java 排序列表数组算法

Java 排序列表数组算法,java,arraylist,mergesort,Java,Arraylist,Mergesort,编辑: 所以我真的解决了问题。。首先,索引范围超出范围,因为对于我的while循环,我没有在charB2>charA2事件中设置counter=0。但是,由于某种原因,在我的索引中使用++计数器会无限期地循环程序。因此,我做了一个小修正: 抱歉,如果从一开始这似乎是一个不必要的帖子,但是,在发布了我的问题后,我得到了很多不同的反馈,这让我尝试了其他我不会想到的选择 int c = 1; while (charA2 == charB2) { charA = a.

编辑:

所以我真的解决了问题。。首先,索引范围超出范围,因为对于我的while循环,我没有在
charB2>charA2
事件中设置
counter=0
。但是,由于某种原因,在我的索引中使用
++计数器
会无限期地循环程序。因此,我做了一个小修正:

抱歉,如果从一开始这似乎是一个不必要的帖子,但是,在发布了我的问题后,我得到了很多不同的反馈,这让我尝试了其他我不会想到的选择

    int c = 1;

    while (charA2 == charB2) {

        charA = a.charAt(c);
        charB = b.charAt(c);
        c++;

        charA2 = charA;
        charB2 = charB;
        if (charA2 > charB2) {
            merged.set(j, b);
            merged.set(j + 1, a);
        }
因此,我在java中得到了两个字符串ListArray,我需要编写一个方法,而不使用Collections.sort来组合这两个列表并对它们进行排序

public static ArrayList<String> merged(ArrayList<String> lst1, ArrayList<String> lst2) {

    int size = lst1.size() + lst2.size();
    ArrayList<String> merged = new ArrayList<String>(size);

    merged.addAll(lst1);
    merged.addAll(lst2);

    int counter = 0;
    for (int i = 0; i < merged.size(); i++) {
        for (int j = 0; j < merged.size() - 1; j++) {
            String a = merged.get(j);
            String b = merged.get(j + 1);

            Character charA = a.charAt(counter);
            Character charB = b.charAt(counter);

            int charA2 = charA;
            int charB2 = charB;

            if (charA2 > charB2) {
                merged.set(j, b);
                merged.set(j + 1, a);
            } else
            if (charA2 == charB2) {
                while (charA2 == charB2) {
                    charA = a.charAt(++counter);
                    charB = b.charAt(++counter);

                    charA2 = charA;
                    charB2 = charB;
                    if (charA2 > charB2) {
                        merged.set(j, b);
                        merged.set(j + 1, a);
                        counter = 0;
                    } else {
                        counter=0;
                    }
                }
            }
        }
    }
    return merged;
 }
公共静态ArrayList合并(ArrayList lst1,ArrayList lst2){
int size=lst1.size()+lst2.size();
合并的ArrayList=新的ArrayList(大小);
合并。添加全部(lst1);
合并。添加全部(lst2);
int计数器=0;
对于(int i=0;icharB2){
集合(j,b);
集合(j+1,a);
}否则
if(charA2==charB2){
while(charA2==charB2){
charA=a.charAt(++计数器);
charB=b.charAt(++计数器);
charA2=charA;
charB2=charB;
if(charA2>charB2){
集合(j,b);
集合(j+1,a);
计数器=0;
}否则{
计数器=0;
}
}
}
}
}
返回合并;
}
我的方法基本上是将同一索引处的字符串转换为一个字符,然后我可以将其转换为一个int值,如果当前元素的整数值大于下一个,我就交换它们


所以我想,如果我只是迭代列表并将每个元素与其下一个元素进行比较,我最终可以对它进行排序,但由于某种原因,我遇到了一个错误,即当
charA2==charB2
时,索引范围超出了范围

您的合并方法不对
lst1
lst2
的初始顺序进行假设:在开始时将两个列表中的所有元素添加到
merged
数组中,并尝试对结果数组执行插入排序

如果可以对字符串使用
compareTo
方法,则可以简化代码:

公共静态ArrayList合并(ArrayList lst1,ArrayList lst2){
int size=lst1.size()+lst2.size();
合并的ArrayList=新的ArrayList(大小);
合并。添加全部(lst1);
合并。添加全部(lst2);
对于(int i=大小;i-->0;){
布尔交换=假;
对于(int j=0;j0){
集合(j,b);
集合(j+1,a);
交换=真;
}
}
如果(!已交换)
打破
}
返回合并;
}
如果已知列表
lst1和
lst2
已排序,则可以使用更有效的方法将它们合并到
merged
,这可能在
mergesort`课程中有所介绍:

公共静态ArrayList合并(ArrayList lst1,ArrayList lst2){
//假设lst1和lst2已排序
int size1=lst1.size();
int size2=lst2.size();
合并的ArrayList=新的ArrayList(大小1+大小2);
int i=0,j=0,k=0;
而(i如果(a.compareTo)(b)您的合并方法没有假设
lst1
lst2
的初始顺序:您将两个列表中的所有元素添加到开头的
合并的
数组中,并尝试对结果数组执行插入排序

如果可以对字符串使用
compareTo
方法,则可以简化代码:

公共静态ArrayList合并(ArrayList lst1,ArrayList lst2){
int size=lst1.size()+lst2.size();
合并的ArrayList=新的ArrayList(大小);
合并。添加全部(lst1);
合并。添加全部(lst2);
对于(int i=大小;i-->0;){
布尔交换=假;
对于(int j=0;j0){
集合(j,b);
集合(j+1,a);
交换=真;
}
}
如果(!已交换)
打破
}
返回合并;
}
如果已知列表
lst1和
lst2
已排序,则可以使用更有效的方法将它们合并到
merged
,这可能在
mergesort`课程中有所介绍:

公共静态ArrayList合并(ArrayList lst1,ArrayList lst2){
//假设lst1和lst2已排序
int size1=lst1.size();
int size2=lst2.size();
合并的ArrayList=新的ArrayList(大小1+大小2);
int i=0,j=0,k=0;
而(i我的教授说我们不能使用任何方法对列表进行排序,所以我们可以使用除此之外的任何方法。你可以使用它们的
。compareTo(String other)
方法来比较字符串吗?是的。但是我不熟悉.campar