2017-04-16 13 views
-4

現在、私はリンクされたリストをソートする基本的なアルゴリズムでは苦労しています。私は最初のリンクリストの整数オブジェクトをコピーすることができる2つの追加リンクリスト(最初は空)を持っています。ソートアルゴリズムJava

私の問題は、すべての私の試行が単純に機能しないことです。下のコピーされた例では、両方のwhileループを通過しますが、すべてが3番目のリンクリスト(zug3.zug3)でソートされるまで、すべてをループする方法はわかりません。また、私はzug1の実際の最小値をzug2の最小値と比較し、値が小さいリストで並べ替えを続けます。これは、ソートの開始時には不可能です。なぜなら、私が空のListをgetSmallest()したいのであれば、それはnullポインタ例外を取得するからです。

私は今、別のfor-loops、while-loops、if-else文で3日間使用していますので、これを試していますが、正確に動作させる方法はわかりません。

助けてください! programmの

例:

public class Abstellgleis { 

LinkedList<Integer> zug1 = new LinkedList<Integer>(); 


void initialize() { 
    for (int i = 0; i <15;i++) { 
     Random zahl = new Random(); 
     int integer = zahl.nextInt(15); 
     zug1.add(integer); 
    } 
} 
public void wagenAnkoppeln(int i) { 
    zug1.addFirst(i); 
} 
int wagenAbkoppeln() { 
    int waggonNummer = zug1.getFirst(); 
    zug1.removeFirst(); 
    return waggonNummer; 
} 

int getSmallest() { 
    int smallest = zug1.size(); 
    for(int i =1; i <zug1.size()-1; i++) 
    { 
     if(zug1.get(i) < smallest) 
     { 
      //int smallest = integers.get(Oedipus); 
      smallest = zug1.get(i); 

     } 
    } 
    return smallest; 
} 

}

public class Rangiergleis { 


LinkedList<Integer> zug2 = new LinkedList<Integer>(); 


void waggonAnkoppeln(int i) { 
    zug2.addFirst(i); 
} 


int waggonAbkoppeln() { 
    int waggonNummer = zug2.getFirst(); 
    zug2.removeFirst(); 
    return waggonNummer; 
} 


int getSmallest() { 
    int smallest = 100; 
    for (int i = 0; i < zug2.size() - 1; i++) { 
     if (zug2.get(i) < smallest) { 
      smallest=zug2.get(i); 
     } 
    } 
    return smallest; 
} 

}

public class Zuggleis { 

LinkedList<Integer> zug3 = new LinkedList<Integer>(); 

void waggonAnkoppeln(int i) { 
    zug3.addLast(i); 
} 

}

public class Steuerung { 

public static void main(String[] args) { 

    Abstellgleis zug1 = new Abstellgleis(); 
    zug1.initialize(); 


    Rangiergleis zug2 = new Rangiergleis(); 


    Zuggleis zug3 = new Zuggleis(); 


    System.out.println("Abstellgleis:" + zug1.zug1); 
    System.out.println("Rangiergleis: " + zug2.zug2); 
    System.out.println("Abstellgleis: " + zug3.zug3); 


     while (!zug1.zug1.isEmpty()) { 


       if (zug1.zug1.getFirst() != zug1.getSmallest()) { 
        zug2.waggonAnkoppeln(zug1.zug1.getFirst()); 
        System.out.println("Vom Abstellgleis wurde Wagen " + 
          zug1.zug1.getFirst() + " aufs Rangiergleis bewegt"); 
        zug1.zug1.removeFirst(); 
       } 
       else if (zug1.zug1.getFirst() == zug1.getSmallest()) { 
        zug3.waggonAnkoppeln(zug1.zug1.getFirst()); 
        System.out.println(zug1.zug1.getFirst() + "wurde aufs Zuggleis bewegt"); 
        zug1.zug1.removeFirst();  
       } 

       System.out.println("Abstellgleis:" + zug1.zug1); 
       System.out.println("Rangiergleis: " + zug2.zug2); 
       System.out.println("Zuggleis: " + zug3.zug3); 


     } 

     while (!zug2.zug2.isEmpty()) { 


      if (zug2.zug2.getFirst() != zug2.getSmallest()) { 
       zug1.wagenAnkoppeln(zug2.zug2.getFirst()); 
       System.out.println("Vom Rangiergleis wurde Wagen " + 
         zug2.zug2.getFirst() + " aufs Abstellgleis bewegt"); 
       zug2.zug2.removeFirst(); 
      } 
      else if (zug2.zug2.getFirst() == zug2.getSmallest()) { 
       zug3.waggonAnkoppeln(zug2.zug2.getFirst()); 
       System.out.println(zug2.zug2.getFirst() + " wurde vom Rangiergleis aufs Zuggleis bewegt"); 
       zug2.zug2.removeFirst(); 


      } 
      System.out.println("Abstellgleis:" + zug1.zug1); 
      System.out.println("Rangiergleis: " + zug2.zug2); 
      System.out.println("Zuggleis: " + zug3.zug3); 

     } 
     if (zug1.zug1.isEmpty()) { 

      while (!zug2.zug2.isEmpty()) 

       if (zug2.zug2.getFirst() != zug2.getSmallest()) { 
        zug1.wagenAnkoppeln(zug2.zug2.getFirst()); 
        System.out.println("Vom Abstellgleis wurde Wagen " + 
          zug2.zug2.getFirst() + " aufs Rangiergleis bewegt"); 
        zug2.zug2.removeFirst(); 
       } 
       else if (zug2.zug2.getFirst() == zug2.getSmallest()) { 
        zug3.waggonAnkoppeln(zug2.zug2.getFirst()); 
        System.out.println(zug2.zug2.getFirst() + "wurde aufs Zuggleis bewegt"); 
        zug2.zug2.removeFirst();  
       } 
      System.out.println("Abstellgleis:" + zug1.zug1); 
      System.out.println("Rangiergleis: " + zug2.zug2); 
      System.out.println("Zuggleis: " + zug3.zug3); 
     } 
    } 


    } 
+0

'Abstellgleis'と' Rangiergleis'の 'getSmallest'メソッドが正しく見えません。まず、 'smallest'を' zug1.size() 'に設定します。最初はサイズが15の場合はこれが問題ありませんが、Zugが短くなるにつれてサイズが最小の要素よりも小さい場合があり、メソッドが間違った結果を与えることがあります。 'Rangiergleis'では100に初期化しています。それはサウンダーです。どちらの方法でも最後の要素がありません。 'i

+0

あなたのプログラムがどのように不正確であるか正確にするために、ソートの前後にサンプルリストを与えることができますか?表示されているエラーメッセージも正確に引用してください(ある場合)。 –

+0

ありがとう!今はすべてが完璧です! –

答えて

0

getSmallestの方法はAbstellgleisRangiergleisで正しく表示されません。最初にsmallestzug1.size()に設定することから始めます。最初はサイズが15の場合はこれが問題ありませんが、Zugが短くなるにつれてサイズが最小の要素よりも小さい場合があり、メソッドが間違った結果を与えることがあります。 Rangiergleisでは100に初期化しています。これはサウンダーです。どちらの方法でも最後の要素がありません。たとえばAbstellgleis.getSmallest()に:

for(int i =1; i <zug1.size()-1; i++) 

これは、最初と最後の要素の両方が不足して実際にあります。

for (int i = 0; i < zug1.size(); i++) { 

    for (int i = 0; i <= zug1.size() - 1; i++) { 

前者は、従来のようになります。それは、次の2つのいずれかでなければならないので、要素は、zug1.size() - 1 0〜インデックスされます。列車に少なくとも1つのワゴンがあることが確かであれば、もちろんsmallestからzug1.get(0)に初期化し、ループを1から実行することができます(これは意図したものでした)。

Rangiergleis.getSmallest()では、ループは0から実行されますが、最後の要素はAbstellgleisと同じ方法で欠落しています。

関連する問題