Java的。 ArrayList包含无法正常工作的方法

时间:2016-02-13 10:02:46

标签: java android arraylist

我正在检查ArrayList是否包含object:

            List<Property> propertiesByName = getPropertiesByCategory(propertyCategory);
        for(Property property: propertiesByName){
            List<Property> propertyList = getVariationItem().getProperties();
            Galgo.log("*******************");
            Galgo.log(propertyList.toString());
            Galgo.log(property.toString());
            Galgo.log("contains:"+propertyList.contains(property));
        }

我正在关注日志:

*******************
[Property{name='color', value='red'}, Property{name='size', value='42'}]
Property{name='color', value='red'}
contains:false
*******************
[Property{name='color', value='red'}, Property{name='size', value='42'}]
Property{name='color', value='blue'}
contains:false
Database: get 2 variations
*******************
[Property{name='color', value='red'}, Property{name='size', value='42'}]
Property{name='size', value='42'}
contains:false
*******************
[Property{name='color', value='red'}, Property{name='size', value='42'}]
Property{name='size', value='34'}
contains:false

正如您在第一和第三种情况中所看到的,它应该返回true。有什么问题?

我的代码的其他部分。第一种按类别(颜色,大小)获取属性的方法。第二种方法是获取所有可用的属性:

            private List<Property> getPropertiesByCategory(String category){
            List<Property> properties = new ArrayList<>();
            for(Property property: getAllProperties()){
                if(property.getName().equals(category)){
                    if(!properties.contains(property)){
                        properties.add(property);
                    }
                }
            }
            return properties;
        }

        private List<Property> getAllProperties() {
            List<Property> propertyList = new ArrayList<>();
            for(VariationItem variationItem: getProductItem().getVariationsList()){
                for(Property property: variationItem.getProperties()){
                    if(!propertyList.contains(property))
                    {
                        propertyList.add(property);
                    }
                }
            }
            return propertyList;
        }

2 个答案:

答案 0 :(得分:2)

要使用class Session { public:Session() {} }; class Requestor { public: Requestor(const Session& session) {}; }; class Client { public:Client() { Session newSession; requestor = Requestor(newSession); } private: Session session; Requestor requestor; }; 方法,您必须覆盖containsequals()方法才能实现此目的。您可以查看此答案以了解实施https://stackoverflow.com/a/16069158/1320616。实际上hashCode()会比较两个对象。并且要比较两个对象,您必须实现contains()方法。

编辑:以下是完整的详细信息

所以当你使用contains()时它正在做什么

equals()

如果你没有在你的类中实现equals()方法,它将采用Object类中的@Override public boolean contains(Object object) { Object[] a = array; int s = size; if (object != null) { for (int i = 0; i < s; i++) { if (object.equals(a[i])) { return true; } } } else { for (int i = 0; i < s; i++) { if (a[i] == null) { return true; } } } return false; } 方法

equals()

所以现在它减少到==正在两个对象之间使用来比较它们。当你在两个对象之间放置==时,它会根据两个东西进行比较(a)两个对象的哈希码(b)它使用两个对象的public boolean equals(Object o) { return this == o; }

每个对象都分配有不同的哈希码。这就是为什么toString()没有给出正确结果的原因。

答案 1 :(得分:0)

您可以像这样检查字符串:

-o