【问题标题】:What is the most efficient way to get the count of a Object list in java?在java中获取对象列表计数的最有效方法是什么?
【发布时间】:2014-06-17 11:59:59
【问题描述】:

我有一个列表和一个对象,如下所示

List<MyObj> myList;

public class MyObjextends
{
   String parameter1;

    public String getParameter1()
    {
        return parameter1;
    }
}

我需要一种有效的方法来根据对象中 parameter1 的值获取 myList 的计数,而无需通过下面的 for 循环

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

谁能告诉我怎么做?

【问题讨论】:

  • 请告诉我们您不想使用for 循环的原因。
  • 如果不使用哈希表(或 Java Equivalent,已经有一段时间了),您将无法对项目的属性进行直接索引查找;您需要遍历列表以查看该项目是否在其中。因此,要计算符合特定条件的项目,您必须遍历列表。
  • 你不能,你可以将你的循环包装在一些通用的 util 函数中,但你不能摆脱它
  • 不,似乎 OP 只想计算符合他/她条件的对象(请参阅obj.getParameter().equals()`

标签: java arrays list arraylist


【解决方案1】:

使用从parameter1到List of MyObj的Map,然后可以使用map.get("Some_Text")的大小

【讨论】:

    【解决方案2】:

    您可以将列表包装在一个也有HashMap&lt;String, List&lt;MyObj&gt;&gt; 的类中。只允许通过也控制哈希映射的方法访问列表。每当一个项目被添加到列表中时,它也应该被添加到哈希映射中。

    【讨论】:

      【解决方案3】:

      如果保留List 结构,则必须使用循环来完成。如果你不这样做,你使用的 api 会做任何事情。

      如果这是你要解决的主要问题,可以考虑使用MultiMap结构。像番石榴的ListMultimap&lt;String, MyObj&gt;

      实际上它类似于map&lt;String, List&lt;MyObj&gt;&gt;

      【讨论】:

        【解决方案4】:

        我不明白你为什么不使用 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 循环。

        【讨论】:

          【解决方案5】:

          您没有真正的理由不希望在有序数组中搜索,因为接口 List 带有循环。这个循环的大 O 表示法是 O(N),这正是假装的。

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-08
            • 2017-07-19
            • 2011-07-13
            • 2017-06-30
            • 1970-01-01
            • 2015-08-11
            相关资源
            最近更新 更多