2017-12-23 5 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

는 요소 (5)는 2''값을 갖도록 발생합니까를? –

+0

귀하의 의견은 어떻게 생겼습니까? – johnII

답변

2

귀하의 LinkedList 주셔서 감사 유형 Long입니다 - 이것은이 경우에 중요하다. 이러한 두 가지 방법으로 컴파일러를 혼동하고 있습니다 :

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

이제 다음과 같은 코드가 LinkedListLong을 입력있을 때 무엇을 하는가, 자신에게 물어? remove 메소드가 호출되는 결정

LinkedList.remove(5); 

컴파일러는 intLong로 또는로 (상기 예에서 "5") 상기 수치 파라미터를 해석하고 있는지 여부에 따라 달라진다.

코드에서 명시 적 캐스트를 사용하여 방법의 LinkedList.remove(int index) 버전을 사용하려면 컴파일러 말하는 명시 적으로 시도해보십시오

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! 
관련 문제