检查java中列表中出现次数的最快方法

时间:2014-09-01 16:17:25

标签: java

我有一个列表,列表中的每个元素都包含一个Points数组。

List<LineString> lines = new LinkedList<LineString>()

列表如下所示:

object1 - ((2.36937, 48.82156, NaN), (2.36935, 48.82159, NaN), (2.36931, 48.8217, NaN))
object2 - ((2.35855, 48.83217, NaN), (2.35851, 48.83218, NaN), (2.35846, 48.83219, NaN), (2.35842, 48.83218, NaN), (2.35838, 48.83217, NaN))
object3 - ((2.35841, 48.832, NaN), (2.35846, 48.83199, NaN), (2.35852, 48.832, NaN), (2.35857, 48.83202, NaN), (2.3586, 48.83205, NaN), (2.35861, 48.83208, NaN), (2.35861, 48.83212, NaN), (2.35859, 48.83214, NaN))

依此类推。我想计算列表中所有对象中每个对象的第一个元素的出现次数。 哪种方法最快?

该列表有近70000个对象,我的实现方式花费了太多时间来提供结果,因为我正在使用O(n * n)实现:

for (ListIterator l = validLines.listIterator(); l.hasNext();)
{
        int aux1=0, aux2=0;
        LineString validLine = (LineString) l.next();

        for(ListIterator m = (ListIterator) lines.listIterator(); m.hasNext();)
        {

                LineString compare = (LineString) m.next();
                for(int i=0;i<compare.getCoordinates().length;i++)
                {
                   if( validLine.getCoordinates()[0] == compare.getCoordinates()[i] )aux1++;
                   if( validLine.getCoordinates()[validLine.getCoordinates().length-1] == compare.getCoordinates()[i] ) aux2++;
                   if(aux1 >1 || aux2>1)break;

                }
        }

}

有什么方法可以让它更快?

1 个答案:

答案 0 :(得分:0)

有点不清楚你在寻找什么,但如果我猜对了,下面的东西可能会在平均O(n)时间内运行:

Map<MyElement, Integer> nOcurrences = new HashMap<MyElement, Integer>();
for(ElementType element : myList) {
  if(nOccurrences.contains(element) {
    nOcurrences.put(element, nOcurrences.get(element) + 1);
  } else {
    nOcurrences.put(element, 1);
  }
}
for(ElementType element : nOcurrences.keySet()) {
  System.out.format("%s occurs %d times.%n", element, nOcurrences.get(element));
}

出于显而易见的原因,您必须相应地覆盖equals()hashCode()