содержит метод со списком объектов в Java - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть список объектов "SaleItem". они все объекты одного класса. каждый объект имеет строковое поле «имя» и целое поле «значение». Я хочу посмотреть, если один из объектов содержит имя. Кажется, что я не могу использовать метод «содержит», чтобы сделать это. Я вижу два решения. один - перебрать все объекты, чтобы проверить, есть ли у него имя:

    for (SaleItem item: myList) {
        if (item.getName() == "banana") {
            // do stuff
        }
    }

Другое решение - создать новый список строк из «myList» и использовать для него метод содержимого:

    ArrayList<String> nameList = new ArrayList<>();
    for (SaleItem item: myList) {
        nameList.add(item.getName());
    }
    if (nameList.contains("banana")) {
        // do stuff
    }

Я думаю, что первый метод был бы наиболее эффективным, если бы я делал это только один раз, а второй был бы более эффективным, если бы я делал это много раз. Будучи немного новичком без формального образования, я не знаю, что уместно в этой ситуации.

Ответы [ 3 ]

1 голос
/ 08 ноября 2019

Так как SaleItem.getName () возвращает строку, вы должны иметь возможность использовать метод "contains". Похоже, вы неправильно инициализировали объект ArrayList или SaleItem.

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

        List<SaleItem> list = new ArrayList<SaleItem>();
        SaleItem s1 = new SaleItem();
        s1.setName("banana");
        s1.setValue(1);
        SaleItem s2 = new SaleItem();
        s2.setName("apple");
        s2.setValue(2);
        list.add(s1);
        list.add(s2);
        for (SaleItem item: list) {
            if (item.getName().contains("banana")) {
                System.out.println("Pass");
            }
        }
    }

}

class SaleItem {
    private String name;
    private int value;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
}
0 голосов
/ 08 ноября 2019

Метод List .contains не является магическим, обычно он просто перебирает элементы, проверяя на равенство, O (n) линейную производительность.

Ваше первое решение, вероятно, в порядке.

Если вы действительно ожидали повторного доступа и хотели получить более высокую производительность, чем линейная производительность при последующих поисках, вы, вероятно, захотите построить Map<String,SaleItem> илиSet<String> в зависимости от того, что вы хотели с ним сделать. Но эти решения обычно работают только на точных совпадениях. Если вам нужны совпадения без учета регистра, они должны быть TreeMap или TreeSet с учетом регистра без учета регистра. И если вам нужно частичное сопоставление (например, с использованием String.contains() или регулярного выражения), вам нужно вернуться к линейному поиску.

Но не делайте этого, если только вам не нужно. Сохраняй это простым.

0 голосов
/ 08 ноября 2019

Попробуйте с этим кодом

public class SaleItem {

    private String itemName;

    public String getItemName() {
        return itemName;
    }

    public SaleItem setItemName(String itemName) {
        this.itemName = itemName;
        return this;
    }

    @Override
    public String toString() {

        return "[SaleItem : { itemName = " + this.getItemName() + " }]";
    }

    public static void main(String[] args) {
        ArrayList<SaleItem> nameList = new ArrayList<>();
        nameList.add(new SaleItem().setItemName("banana"));
        nameList.add(new SaleItem().setItemName("grape"));
        nameList.add(new SaleItem().setItemName("watermelon"));
        nameList.add(new SaleItem().setItemName("orange"));
        nameList.add(new SaleItem().setItemName("guava"));

        for (SaleItem item : nameList) {
            if (item.toString().contains("banana")) {
                // Do this
            }

        }
    }
}
...