удаление Java-подсписка - PullRequest
       9

удаление Java-подсписка

4 голосов
/ 25 января 2012

Я пытаюсь создать список объектов и затем подсписок, а затем удалить все элементы в подсписке и затем снова отобразить основной список. Однако, когда я пытаюсь удалить элементы из подсписка, я получаю сообщение об ошибке во время выполнения indexoutofbounds и неизвестного источника. Как это исправить, чтобы приложение работало?

import java.util.*;

class Eval{
    Eval(){         
    }   
}

public class Ch11Ex7 {
    public static void main(String[] args){ 

        Eval e1 = new Eval();
        Eval e2 = new Eval();
        Eval e3 = new Eval();
        Eval e4 = new Eval();
        Eval e5 = new Eval();

        Eval[] eva = {e1, e2, e3, e4, e5};

        //ArrayList<Eval> ev = new ArrayList<Eval>(Arrays.asList(eva));
        List ev = Arrays.asList(eva);
        List<Eval> sub = ev.subList(1, 3);  
        for(int i=0; i< ev.size() ; i++)
              System.out.println(ev.get(i));        
        System.out.println("Sublist");  
        for(int i=0; i< sub.size() ; i++)
              System.out.println(sub.get(i));   
        System.out.println("Remove element");
        sub.remove(2);
    }
}

Ответы [ 6 ]

4 голосов
/ 25 января 2012

Второй индекс subList является эксклюзивным, поэтому, если вы хотите, чтобы элементы были между [1..3], вам нужно использовать:

List<Eval> sub = ev.subList(1, 4); 

Более того, то, что вы пытаетесь сделать, все равно не будет работать, потому что реализация List, возвращаемая subList, не реализует операцию remove, поэтому вы получите java.lang.UnsupportedOperationException.

Вы должны создать суб как ArrayList вместо:

ArrayList<Eval> sub = new ArrayList<Eval>(ev.subList(1, 4));
2 голосов
/ 25 января 2012

Списки Java проиндексированы нулями, поэтому:

List<Eval> sub = ev.subList(1, 3) // = {e2, e3} (subList is not inclusive on second index)

И

sub.remove(2); // Attempts to remove 3rd element from 2 element list

Итак, уменьшите ваши индексы на один.

import java.util.*;

class Eval{
Eval(){         
}   
}

public class Ch11Ex7 {
public static void main(String[] args){ 

    Eval e1 = new Eval();
    Eval e2 = new Eval();
    Eval e3 = new Eval();
    Eval e4 = new Eval();
    Eval e5 = new Eval();

    Eval[] eva = {e1, e2, e3, e4, e5};

    //ArrayList<Eval> ev = new ArrayList<Eval>(Arrays.asList(eva));
    List ev = Arrays.asList(eva);
    List<Eval> sub = ev.subList(0, 2); 
    sub = new ArrayList<Eval>(sub);
    for(int i=0; i< ev.size() ; i++)
          System.out.println(ev.get(i));        
    System.out.println("Sublist");  
    for(int i=0; i< sub.size() ; i++)
          System.out.println(sub.get(i));   
    System.out.println("Remove element");
    sub.remove(1);
}

}

1 голос
/ 25 января 2012

Список - упорядоченный тип. Поэтому (насколько я понимаю) вы не можете просто случайно удалить элемент из списка. Это изменит порядок.

Это здесь, например, работает:

public class Ch11Ex7 {
    public static void main(String[] args){ 

        Eval e1 = new Eval();
        Eval e2 = new Eval();
        Eval e3 = new Eval();
        Eval e4 = new Eval();
        Eval e5 = new Eval();

        Eval[] eva = {e1, e2, e3, e4, e5};

        ArrayList<Eval> ev = new ArrayList<Eval>(Arrays.asList(eva));
        ArrayList<Eval> sub = new ArrayList<Eval>(ev.subList(1, 3));  
        printList(ev);
        System.out.println("Sublist");  
        printList(sub);   
        System.out.println("Remove element");

        sub.remove(1);

        System.out.println("New List"); 
        printList(ev);
        System.out.println("Sublist"); 
        printList(sub);
    }

    public static void printList(List<Eval> list) {
        for(int i=0; i< list.size() ; i++)
            System.out.println(list.get(i));   
    }
}

Я позволил себе несколько изменений в стиле кода ... но в целом это работает (и проверено)

Надеюсь, это поможет!

1 голос
/ 25 января 2012

Как сказал @Peter, индексы в Java основаны на 0, поэтому вам нужно использовать:

sub.remove(1)

Тем не менее , с вашей текущей программой вы получите UnsupportedOperationException, так как Arrays.asList () возвращает список фиксированного размера, который не поддерживает удаление (что будет отражено в ev, потому что subList () отражает изменения в исходном списке).

Вам необходимо использовать ArrayList или аналогичную реализацию интерфейса List с изменяемыми размерами.

1 голос
/ 25 января 2012

Вы хотите сказать sub.remove(1) И вы хотите объявить список как ArrayList - без использования Arrays.asList.Ваш код как есть выдаст UnsupportedOperationException, потому что список массивов имеет фиксированную длину.

1 голос
/ 25 января 2012

В вашем подсписке нет элемента с индексом 2 sub Так что ошибка очевидна.

Индексация начинается с 0.

В вашем случае

sub =  = {e2, e3}
sub[0] = e2
sub[1] = e3

Итак, когда вы пытаетесь удалить элемент с индексом 2, вы получаете исключение времени выполнения.Если вы хотите удалить второй элемент из списка, вы должны позвонить

sub.remove(1)

...