LinkedList删除错误的索引

时间:2017-12-23 02:38:29

标签: java list linked-list

我有一个非常奇怪的问题,我不知道是什么原因引起的。看来remove方法从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();
    }
}

1 个答案:

答案 0 :(得分:2)

您的LinkedList类型为Long - 在这种情况下这很重要。您将编译器与这两种方法混淆:

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

现在问问自己,当LinkedList类型Long时,以下代码会做什么?

LinkedList.remove(5);

决定调用哪个remove方法取决于编译器是否将上述数字参数(&#34; 5&#34;在上例中)解释为int或{{1 }}

尝试通过在代码中使用显式强制转换来明确告诉编译器您要使用方法的Long版本:

LinkedList.remove(int index)