Как я могу проверить в Java, если объект существует по определенному индексу? - PullRequest
0 голосов
/ 31 января 2012

Я использую Arraylist и вставляю объекты в определенный индекс (например, элемент с индексом 0 и 2, но не с индексом 1) И я хочу знать, следует ли мне использовать Arraylist.add(id,obj) или Arraylist.set(id,obj) , Я использую следующий тест if(Arraylist.get(t.imgIdx) == null), но он все время выбрасывает меня за пределы. Как я могу / должен это проверить?

public static int GiveBackAverageID(Vector<DMatch> lista){

        ArrayList<CMatch> workingList = new ArrayList<CMatch>();

        for (DMatch t : lista){
            if(workingList.get(t.imgIdx) == null){
                workingList.add(t.imgIdx, new CMatch(t.imgIdx,t.distance,1));
            }else{
                CMatch pom = workingList.get(t.imgIdx);
                pom.setSummaDist(pom.getSummaDist()+t.distance);
                pom.setCount(pom.getCount()+1);
                workingList.set(t.imgIdx, pom);
            }
        }
...

спасибо Csabi

Ответы [ 5 ]

3 голосов
/ 31 января 2012

Если вы хотите проверить, находится ли объект в позиции, используйте IndexOf(). Этот метод возвращает -1, если объект отсутствует в списке.

UPDATE

На вашем новом куске кода:

public static int GiveBackAverageID(Vector<DMatch> lista){

    ArrayList<CMatch> workingList = new ArrayList<CMatch>();

    for (DMatch t : lista){
        if(t.imgIdx >= workingList.size() || t.imgIdx < 0)
        {
            // do something with wrong indices.
        }
        else
        {
            if(workingList.get(t.imgIdx) == null){
                workingList.add(t.imgIdx, new CMatch(t.imgIdx,t.distance,1));
            }else{
                CMatch pom = workingList.get(t.imgIdx);
                pom.setSummaDist(pom.getSummaDist()+t.distance);
                pom.setCount(pom.getCount()+1);
                workingList.set(t.imgIdx, pom);
            }
        }
    }
}

Или то, что вы также можете сделать, - это создать больше возможностей в вашем workingList:

public static int GiveBackAverageID(Vector<DMatch> lista){

    // Creating more capacity in the constructor!
    ArrayList<CMatch> workingList = new ArrayList<CMatch>(lista.size());

    for (DMatch t : lista){
        if(workingList.get(t.imgIdx) == null){
            workingList.add(t.imgIdx, new CMatch(t.imgIdx,t.distance,1));
        }else{
            CMatch pom = workingList.get(t.imgIdx);
            pom.setSummaDist(pom.getSummaDist()+t.distance);
            pom.setCount(pom.getCount()+1);
            workingList.set(t.imgIdx, pom);
        }
    }
}

В качестве лучшей альтернативы я бы использовал HashTable<int,DMatch>.

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

Я думаю, что проблема с вашим кодом в том, что значение t.imgIdx иногда больше, чем размер массива.

Но когда вы обращаетесь к элементу (который должен быть нулевым), как к коду, который вы сделали if(workingList.get(t.imgIdx) == null), ваше условие if будет возвращать логическое значение при условии, что параметр, переданный get (), меньше размерамассива.

Вы можете попробовать приведенный ниже пример и передать различные значения параметров методу get ().

public static void main(String[] args) {

    ArrayList al = new ArrayList();
    al.add(0, "5");
    al.add(1, "10");
    al.add(2, "15");
    al.add(3, "20");

    al.set(1, null);//setting the element at index 1 to NULL.
    //al.remove(1);//removes the element in list so that the next element's index decreases by 1. 

    if(al.get(1) == null){
        System.out.println("Nothing here..");//this line executes
    }
    else
        System.out.println(al.get(1));

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

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

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

используйте set для замены по определенному индексу, add для добавления объекта в конце и add со значением index для вставки объекта в позицию и перемещения других элементов вправо (добавление единицы к их индексу).

* 1002Исключение за пределами границ означает, что значение вашего индекса, вероятно, слишком велико;или массив был заполнен не так, как вы ожидаете.Разместите полное исключение / код для полного ответа.
0 голосов
/ 31 января 2012

Перехватите исключение и обработайте его должным образом, это говорит, что нет элемента с этим индексом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...