获取java中Object列表计数的最有效方法是什么?

时间:2014-06-17 11:59:59

标签: java arrays list arraylist

我有一个列表和一个如下的对象

List<MyObj> myList;

public class MyObjextends
{
   String parameter1;

    public String getParameter1()
    {
        return parameter1;
    }
}

我需要一种有效的方法来获取myList的计数,该方法基于对象中parameter1的值而不经过for循环

    int count = 0;
    for( MyObj obj: myList)
    {
        if( obj.getParameter1().equals( "Somet_Text") )
        {
            count++;
        }
    }

有人可以告诉我该怎么做吗?

5 个答案:

答案 0 :(得分:0)

使用从参数1到MyObj列表的地图,然后您可以使用map.get("Some_Text")的大小

答案 1 :(得分:0)

您可以将列表包装在同样具有HashMap<String, List<MyObj>>的类中。仅允许通过也控制哈希映射的方法访问列表。每当项目被添加到列表中时,它也应该被添加到哈希映射中。

答案 2 :(得分:0)

如果保持List结构,则必须使用循环。如果你不这样做,你使用的API会以任何方式进行。

如果这是您要解决的主要问题,您可以考虑使用MultiMap结构。像番石榴ListMultimap<String, MyObj>一样。

实际上它类似于map<String, List<MyObj>>

答案 3 :(得分:0)

我不明白为什么你不会使用for循环迭代List,即使效率是一个考虑因素,它实际上也无关紧要。但即便如此,如果您对for有所反对,请使用列表的迭代器

ListIterator<MyObj> it=myList.listIterator();
int count = 0;

    while(it.hasNext()){

if( it.next().getParameter1().equals( "Somet_Text") )
        {
            count++;
        }
}

同时查看ListIterator.next()的源代码,它也不会使用for循环,只要它有任何区别

public E More ...next() {
            checkForComodification();
            int i = cursor;
            if (i >= size)
                 throw new NoSuchElementException();
             Object[] elementData = ArrayList.this.elementData;
            if (i >= elementData.length)
                throw new ConcurrentModificationException();
             cursor = i + 1;
             return (E) elementData[lastRet = i];
     }

但请注意,它使用if语句并递增游标来遍历列表,这又类似于for循环。

答案 4 :(得分:0)

由于接口List带有循环,因此您没有理由不想在有序数组中进行搜索。这个循环的大O符号是O(N),这正是假装的。

如果你必须处理来自大量输入的数据,我建议通过丢弃你不想要的值来预处理信息,并使用你真正需要的值创建数组。 p>

地图解决方案评论也不会解决您的问题,因为一个构造规则是不允许重复值,这正是您想要测量的。