我有一个列表和一个如下的对象
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++;
}
}
有人可以告诉我该怎么做吗?
答案 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>
地图解决方案评论也不会解决您的问题,因为一个构造规则是不允许重复值,这正是您想要测量的。