Сравните новые Целочисленные Объекты в Вопросе о ArrayList

Я храню Целочисленные объекты, представляющие индекс объектов, которые я хочу отследить. Позже в моем коде я хочу проверить, чтобы видеть, соответствует ли индекс конкретного объекта одному из тех Целых чисел, я сохранил ранее. Я делаю это путем создания ArrayList и создания нового Целого числа из индекса для цикла:

ArrayList<Integer> courseselectItems = new ArrayList();

//Find the course elements that are within a courseselect element and add their indicies to the ArrayList
for(int i=0; i<numberElementsInNodeList; i++) {
    if (nodeList.item(i).getParentNode().getNodeName().equals("courseselect")) {
        courseselectItems.add(new Integer(i));
    }
}

Я затем хочу проверить позже, содержит ли ArrayList конкретный индекс:

//Cycle through the namedNodeMap array to find each of the course codes
for(int i=0; i<numberElementsInNodeList; i++) {
    if(!courseselectItems.contains(new Integer(i))) {
        //Do Stuff
    }
}

Мой вопрос, когда я создаю новое Целое число при помощи new Integer(i) я смогу сравнить целочисленное использование ArrayList.contains()? То есть, когда я создаю новое объектное использование new Integer(i), это совпадет с ранее созданным Целочисленным объектом, если международное значение, используемое для создания их, будет тем же?

Я надеюсь, что не сделал это слишком неясным. Спасибо за справку!

7
задан ericso 13 April 2010 в 23:24
поделиться

7 ответов

Да, вы можете использовать List.contains(), так как там используется equals(), а Integer поддерживает это при сравнении с другими Integerами.

Кроме того, из-за автобоксинга вы можете просто написать:

List<Integer> list = new ArrayList<Integer>();
...
if (list.contains(37)) { // auto-boxed to Integer
  ...
}

Стоит упомянуть, что:

List list = new ArrayList();
list.add(new Integer(37));
if (list.contains(new Long(37)) {
  ...
}

будет всегда возвращать false, потому что Integer не является Long. Большинство людей в какой-то момент сбиваются с пути.

Наконец, постарайтесь сделать ваши переменные, которые являются Java Collections, интерфейсного типа, а не конкретного типа, так:

List<Integer> courseselectItems = new ArrayList();

not

ArrayList<Integer> courseselectItems = new ArrayList();
18
ответ дан 6 December 2019 в 06:49
поделиться

Короткий ответ - да, вы должны быть в состоянии сделать ArrayList.contains(new Integer(14)), например, чтобы увидеть, есть ли 14 в списке. Причина в том, что Integer переопределяет метод equals для корректного сравнения себя с другими экземплярами с тем же значением.

1
ответ дан 6 December 2019 в 06:49
поделиться

Как упомянули Клетус и DJ, ваш подход сработает.

Я не знаю контекста вашего кода, но если вас не интересуют конкретные индексы, подумайте также о следующем стиле:

List<Node> courseSelectNodes = new ArrayList<Node>();

//Find the course elements that are within a courseselect element 
//and add them to the ArrayList
for(Node node : numberElementsInNodeList) {
    if (node.getParentNode().getNodeName().equals("courseselect")) {
        courseSelectNodes.add(node);
    }
}

// Do stuff with courseSelectNodes
for(Node node : courseSelectNodes) {
    //Do Stuff
}
1
ответ дан 6 December 2019 в 06:49
поделиться

Да будет, потому что List.contains() использует метод equals() сравниваемого объекта. А Integer.equals() действительно сравнивает целочисленное значение.

1
ответ дан 6 December 2019 в 06:49
поделиться

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

Кроме того, из-за бокса создание класса Integer вручную является излишним.

0
ответ дан 6 December 2019 в 06:49
поделиться

Я выражаю свой ответ в форме (проходного) теста, как пример того, как вы могли бы исследовать это самостоятельно. Чтобы не отговаривать вас от использования SO - это здорово - просто чтобы попытаться продвинуть характеристические тесты .

import java.util.ArrayList;
import junit.framework.TestCase;

public class ContainsTest extends TestCase {
    public void testContains() throws Exception {
        ArrayList<Integer> list = new ArrayList<Integer>();
        assertFalse(list.contains(new Integer(17)));
        list.add(new Integer(17));
        assertTrue(list.contains(new Integer(17)));
    }
}
1
ответ дан 6 December 2019 в 06:49
поделиться

Мой вопрос: когда я создаю новое целое число, используя новое целое число ( i) смогу ли я сравнивать целые числа с помощью ArrayList.contains ()? То есть, когда я создаю новый объект с помощью new Integer (i), будет ли он таким же, как ранее созданный объект Integer, если значение int, используемое для их создания, такое же?

Короткий ответ - да.

Длинный ответ ...

То есть, когда я создаю новый объект, используя new Integer (i), будет таким же, как ранее созданный объект Integer, если Значение int, используемое для их создания, такое же?

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

Однако, несмотря на наличие отдельных идентификаторов , эти два объекта будут иметь эквивалентное значение , т.е. вызов .equals () между ними вернет истину.

Collection.contains ()

Оказывается, наличие отдельных экземпляров эквивалентного значения ( .equals () возвращает true ) - это нормально. Метод .contains () находится в интерфейсе Collection . Описание Javadoc для .contains () говорит:

http://java.sun.com/javase/6/docs/api/java/util/Collection.html#contains (java.lang .Object)

boolean contains (Object o)

Возвращает истину, если эта коллекция содержит указанный элемент. Более того, формально возвращает истину тогда и только тогда, когда эта коллекция содержит хотя бы один элемент e такой, что (o == null? E == null : o.equals (e)) .

Таким образом, он будет делать то, что вы хотите.

Структура данных

Вам также следует подумать, есть ли у вас правильная структура данных.

Список касается исключительно сдерживания? порядок важен? Вы заботитесь о дубликатах? Поскольку список является порядком, использование списка может означать, что ваш код заботится о порядке. Или что вам нужно поддерживать дубликаты в структуре данных.

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

4
ответ дан 6 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: