Java:对ArrayList进行排序并不起作用

时间:2016-05-02 10:32:12

标签: java sorting arraylist

我有一段代码,用10到99(两位数字)的随机整数填充ArrayList<Integer>。然后它应该遍历数组并使用冒泡排序(或交换排序,对它进行排序,说实话,我不太确定它的区别是什么)。但是,我得到的输出真的很奇怪。附件是它的代码和示例输出。

import java.util.*;

public class SortingAnArrayList
{
    public static void main( String[] args )
    {
        ArrayList<Integer> al = new ArrayList<>();
        Random r = new Random();

        for ( int i = 0; i < 20; i++ )
        {
            int rNum = 10 + r.nextInt(90);
            al.add( rNum );
        }
        System.out.println( "ArrayList before: " + al);
        ArrayList<Integer> sortedAl = sortArrayList(al);
        System.out.println( "ArrayList after : " + sortedAl);
    }

    public static ArrayList<Integer> sortArrayList( ArrayList<Integer> a )
    {
        boolean loop;
        ArrayList<Integer> b = a;
        do
        {
            loop = false;
            for ( int i = 0; i < a.size() - 2; i++ )
            {
                if ( b.get(i) > b.get(i + 1) )
                {
                    loop = true;
                    int temp = b.get(i);
                    b.remove(i);
                    b.add( i, b.get(i+1) );
                    b.remove(i+1);
                    b.add( i+1, temp );
                }
            }
        } while (loop);

        return b;
    }
}

输出#1

ArrayList before: [45, 33, 75, 51, 91, 93, 54, 91, 90, 38, 31, 85, 15, 33, 61, 51, 83, 36, 48, 18]
ArrayList after : [93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 18]

输出2

ArrayList before: [73, 39, 68, 54, 12, 63, 90, 55, 53, 24, 14, 80, 58, 12, 64, 25, 82, 27, 20, 55]
ArrayList after : [12, 12, 20, 55, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 55]

请帮忙,因为我不太确定我的代码出错了。谢谢!

7 个答案:

答案 0 :(得分:2)

Collections

怎么样?
Collections.sort(al);

您的主要话题是:

public static void main(String[] args) {
    ArrayList<Integer> al = new ArrayList<>();
    Random r = new Random();

    for (int i = 0; i < 20; i++) {
        int rNum = 10 + r.nextInt(90);
        al.add(rNum);
    }
    System.out.println("ArrayList before: " + al);
    Collections.sort(al);
    System.out.println("ArrayList after : " + al);
}

答案 1 :(得分:1)

应该是这样的:

loop = true;
int temp = b.get(i);
b.remove(i);
b.add( i, b.get(i) );
b.remove(i+1);
b.add( i+1, temp );

当你拨打b.remove(i),时,你将i之后的索引减1。

答案 2 :(得分:1)

b.add( i, b.get(i+1) );

应该是

b.add( i, b.get(i) );

因为在位置b.remove(i);后面的每个项目之前的行中i向左移动了一个位置,因此将其索引更改为-1。这是因为您正在使用List。您的实现应该在array上工作,其中位置不会在移除时移位。

您应该阅读有关remove of the List interface

的文档
  

删除此列表中指定位置的元素(可选   操作)。 向左移动任何后续元素(减去一个   来自他们的指数)。返回从中删除的元素   列表。

答案 3 :(得分:1)

目的是交换两者,导致更多订购。 最好只交换,如下:

                int temp = b.get(i);
                b.set(i, b.get(i+1));
                b.set(i+1, temp);

删除第i个元素会导致get(i+1)现在是另一个下一个整数。

答案 4 :(得分:1)

使用此代码。我测试了它:

&#xA;&#xA;
  public static ArrayList&lt; Integer&gt; sortArrayList(ArrayList&lt; Integer&gt; a)&#xA; {&#XA;布尔循环;&#xA;的ArrayList&LT;整数&GT; b = a;&#xA;做&#XA; {&#XA;&#XA; loop = false;&#xA; for(int i = 0; i&lt; a.size() -  2; i ++)&#xA; {&#XA; if(b.get(i)&gt; b.get(i + 1))&#xA; {&#XA; loop = true;&#xA; int temp = b.get(i);&#xA; // b.remove(i);&#xA; b.set(i,b.get(i + 1));&#xA; // b.remove(i + 1);&#xA; b.set(i + 1,temp);&#xA; }&#XA; }&#XA; System.out.println(“ArrayList b:”+ b);&#xA; } while(loop);&#xA;&#xA;返回b;&#xA;}&#xA;  
&#xA;&#xA;

输出:

&#xA;&# xA;
  ArrayList之前:[81,46,89,39,80,15,40,32,75,13,​​82,45,97,25,62,61,17,18,18, 54]&#xA; ArrayList之后:[13,15,17,18,18,25,32,39,40,45,46,61,62,75,80,81,82,89,97,54] &#XA;  
&#XA;

答案 5 :(得分:1)

不要调用删除和添加,因为这必须复制所有剩余的元素。只需使用set(index, value);

即可
loop = true;
int temp = b.get(i);
b.set( i, b.get(i+1) );
b.set( i+1, temp );

或者,因为set返回先前的值:

loop = true;
b.set(i, b.set(i+1, b.get(i)));

答案 6 :(得分:0)

您应该在add()之前致电remove(),如下所示:

    loop = true;
    int temp = b.get(i);
    b.add( i, b.get(i+1) );
    b.remove(i+1);
    b.add( i+1, temp );
    b.remove(i+2);

然而,使用set()是最佳选择。