2017-12-23 21 views
0

私は非常に奇妙な問題を抱えていますが、原因はわかりません。 removeメソッドは、間違った要素をlinkedListから削除します。これは簡単な例です:LinkedListは間違ったインデックスを削除します

LinkedList<Long> list = new LinkedList<>(); 
int pos=1; 
System.out.println("pos+1:"+(pos+1)); //prints 2 which is true 
list.remove(pos+1); //deletes 5th element 
//if i write list.remove(2); it will delete 2th element which is of course ok 

これは4番目のループ(0からのインデックス)とこの入力に対して起こります。8 5 1 2 3; また、私はそれを入力3 1 2 3に追加します。すべて正常に動作します。

ここにすべてのコードを貼り付けます。ヘルプ

import java.util.LinkedList; 
import java.util.Scanner; 

class Zad3 { 

    public static void main(String[] args) { 

     Scanner input = new Scanner(System.in); 
     long iloscZnakow = 0; 
     long wyrazCiagu; 
     LinkedList<Long> list = new LinkedList<>(); 

     long iloscOperacji = input.nextLong(); 
     iloscZnakow += String.valueOf(iloscOperacji).length(); 
     long pos = 0; 
     while (input.hasNext()) { 
      wyrazCiagu = input.nextLong(); 
      list.add(wyrazCiagu); 
      iloscZnakow += String.valueOf(wyrazCiagu).length(); 
     } 

     long wartoscPrzesuniecia; 
     for (long i = 0; i < iloscOperacji; i++) { 
      System.out.print(i + ":postac poczatkowa ciagu:"); 
      for (long l : list) { 
       System.out.print(l + " "); 
      } 
      System.out.println(); 
      System.out.println("pos aktualna pozycja:" + list.get((int) pos) + " indeks:" + pos); 

      if (list.get((int) pos) % 2 == 0) {// R 
       System.out.print("wykonana operacja R "); 
       if (pos == list.size() - 1) { 
        wartoscPrzesuniecia = list.get(0); 
       } else { 
        wartoscPrzesuniecia = list.get((int) pos + 1); 
       } 
       System.out.println(); 
       System.out.println("pos+1:" + (pos + 1)); 
       list.remove(pos + 1); 
       System.out.println("c=" + wartoscPrzesuniecia); 
       if (pos + wartoscPrzesuniecia >= list.size()) { 
        while (pos < list.size()) { 
         pos++; 
         wartoscPrzesuniecia--; 
        } 
        pos = wartoscPrzesuniecia; 
       } else { 
        pos += wartoscPrzesuniecia; 
       } 

      } else {// X 
       System.out.print("wykonana operacja X "); 
       wartoscPrzesuniecia = list.get((int) pos); 
       long liczba = wartoscPrzesuniecia - 1; 
       list.add((int) (pos + 1), liczba); 

       System.out.println("c=" + wartoscPrzesuniecia); 
       if (pos + wartoscPrzesuniecia >= list.size()) { 
        while (pos < list.size()) { 
         pos++; 
         wartoscPrzesuniecia--; 
        } 
        pos = wartoscPrzesuniecia; 
       } else { 
        pos += wartoscPrzesuniecia; 
       } 
      } 
      System.out.print(":postac koncowa ciagu:"); 
      for (long l : list) { 
       System.out.print(l + " "); 
      } 
      System.out.println(); 
      System.out.println("finalna pozycja POS: " + list.get((int) pos)); 
     } 

     for (long i = pos; i < list.size(); i++) { 
      System.out.print(list.get((int) i) + " "); 
     } 
     for (long i = 0; i < pos; i++) { 
      System.out.print(list.get((int) i) + " "); 
     } 
     System.out.println(); 
     System.out.print(iloscZnakow); 
     input.close(); 
    } 
} 
+0

を2'? –

+0

あなたの入力はどのように見えますか? – johnII

答えて

2

いただきありがとうございますあなたのLinkedListはタイプLongである - これは、この場合に重要です。あなたはこれらの2つの方法でコンパイラを混乱している:

1. LinkedList.remove(Object o) 
2. LinkedList.remove(int index) 

今、あなたのLinkedListLongを入力したときに次のコードは何をするのか、自問してみてください?

LinkedList.remove(5); 

removeメソッドが呼び出される決定コンパイラがintLongとして、または上記のような数値パラメータ(上記の例では「5」)を解釈するかどうかに依存します。

あなたのコードで明示的なキャストを使用することにより、方法のLinkedList.remove(int index)バージョンを使用したいコンパイラ言って、明示的に試してみてください:素子5は、 `値を持って起こるん

LinkedList<Long> list = new LinkedList<>(); 
int pos=1; 
System.out.println("pos+1:"+(pos+1)); 
list.remove((int)pos+1); //Add an explicit cast here to your above code! 
関連する問題