【问题标题】:contains method with list of objects in Java包含Java中对象列表的方法
【发布时间】:2020-03-04 16:25:02
【问题描述】:

我有一个对象列表“SaleItem”。它们都是同一类的对象。每个对象都有一个字符串字段“名称”和一个整数字段“值”。我想看看其中一个对象是否包含名称。看来我不能使用“包含”方法来做到这一点。我看到两个解决方案。一种是遍历所有对象以检查是否有说过名称:

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

另一种解决方案是从“myList”创建一个新的字符串列表并在其上使用 contains 方法:

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

我想如果我只做一次,第一种方法会最有效,如果我做很多次,第二种方法会更有效。作为一个没有受过正规教育的新手,我不知道在这种情况下什么是合适的。

【问题讨论】:

  • 请标记一种编程语言。
  • 如果您需要使用 contains() 方法,请覆盖您的类的 equals 方法以检查名称字段。

标签: java arraylist contains


【解决方案1】:

试试这个代码

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
            }

        }
    }
}

【讨论】:

    【解决方案2】:

    由于 SaleItem.getName() 返回一个字符串,您应该能够使用“包含”方法。 您似乎错误地初始化了 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;
        }
    }
    

    【讨论】:

      【解决方案3】:

      List 的.contains 方法并不神奇,它通常只会循环检查元素是否相等,O(n) 线性性能。

      您的第一个解决方案可能没问题。

      如果您确实期望重复访问并且希望在后续查找中获得比线性性能更好的性能,您可能希望根据您的用途构建一个 Map&lt;String,SaleItem&gt;Set&lt;String&gt;。但这些解决方案通常只适用于完全匹配。一旦您需要不区分大小写的匹配,它们必须是 TreeMapTreeSet 并带有不区分大小写的比较器。如果你想要部分匹配(比如使用String.contains() 或正则表达式),你会想要回到线性搜索。

      但除非必须,否则不要这样做。保持简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-17
        • 2015-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-01
        • 1970-01-01
        相关资源
        最近更新 更多