我有一段代码,用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]
请帮忙,因为我不太确定我的代码出错了。谢谢!
答案 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()
是最佳选择。