2016-05-02 3 views
1

I 99(2桁の番号)に10からのランダム整数でArrayList<Integer>を充填コードの一部を有しています。次に、それを(私は違いが何であるかはかなりわからない、または交換ソート、正直に言うと)、配列を反復処理し、バブルソートを使用して、それを並べ替えることになっています。しかし、私が得る出力は本当に変です。添付されているコードとその出力例です。ジャワ:ソートのArrayListが動作していない

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; 
    } 
} 

OUTPUT#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] 

OUTPUT 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] 

私はコードで間違っていたところ、非常にわからないよう助けてください。ありがとう!

+2

[カスタムオブジェクトのArrayListをプロパティ別にソートする](0120-18751)をご覧ください。 – Koshinae

+0

こんにちは、私たちはしませんシンプルな "なぜ私のコードは動作していませんか?" Stackoverflowに関する質問。しかし、要素 'i'を'削除 'すると、 'i + 1'は新しい' i'になります。削除したり追加したりする代わりに、 'set'メソッド(' b.set(i、b.get(i + 1)); b.set(i + 1、temp); 'を使います。 – Cephalopod

答えて

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),あなたが原因でb.remove(i);によって

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

する必要があります。1.

+0

また、(int i = 0; i uoyilmaz

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

で私の後にインデックスを減らしますポジションの背後にあるすべての商品の前に行があります。iは市です1つの位置を左に置くと、インデックスが-1だけ変更されます。これは、Listで作業しているためです。あなたの実装は、array上で動作し、位置が削除時にシフトされないようにする必要があります。

あなたはremove of the List interfaceに関するドキュメントをお読みください。

このリスト内の指定された位置にある要素を削除します(オプション: 操作)。 シフト左に後続の要素(インデックス値から1を減算 )。 リストから削除された要素を返します。

1

意図は、より多くの順序を引き起こし、2を交換することです。 は、これが最良のように、ちょうどスワップ行うことができます:i番目の要素を取り除く

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

get(i+1)は今、別の、次の整数であることを原因となります。

1

は、このコードを使用します。私はそれをテストしている:

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.set(i, b.get(i+1)); 
//    b.remove(i+1); 
       b.set(i+1, temp); 
      } 
     } 
     System.out.println("ArrayList b : " + b); 
    } while (loop); 

    return b; 
} 

OUTPUT:

ArrayList before: [81, 46, 89, 39, 80, 15, 40, 32, 75, 13, 82, 45, 97, 25, 62, 61, 17, 18, 18, 54] 
ArrayList after : [13, 15, 17, 18, 18, 25, 32, 39, 40, 45, 46, 61, 62, 75, 80, 81, 82, 89, 97, 54] 
1

が、これは残りのすべての要素をコピーすることがあるので、削除して、追加呼び出さないでください。

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

どうCollectionsについて::setは前の値を返しますので、ちょうど、set(index, value);

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

を使用するか、

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); 
} 
0

あなたはこのように、remove()add()を呼び出す必要があります:

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()は最良の選択です。

関連する問題