Java 如何获取最常用的项目
我正在开发一个应用程序,它有一个包含数行的大数组Java 如何获取最常用的项目,java,arrays,frequency,Java,Arrays,Frequency,我正在开发一个应用程序,它有一个包含数行的大数组 transNum[20000][200]//this is the 2d array containing the numbers and always keep track of the line numbers 我使用嵌套循环查找最频繁的项。那是 for(int i=0/*,lineitems=0*/;i<lineCounter;i++) { for(int j=0,shows=1;j<lineitem1[i];
transNum[20000][200]//this is the 2d array containing the numbers and always keep track of the line numbers
我使用嵌套循环查找最频繁的项。那是
for(int i=0/*,lineitems=0*/;i<lineCounter;i++)
{
for(int j=0,shows=1;j<lineitem1[i];j++)
{
for(int t=i+1;t<lineCounter;t++)
{
for(int s=0;s<lineitem1[t];s++)
{
if(transNum[i][j]==transNum[t][s])
shows++;
}
}
if(shows/lineCounter>=0.2)
{
freItem[i][lineitem2[i]]=transNum[i][j];
lineitem2[i]++;
}
}
}
for(int i=0/*,lineitems=0*/;i取决于您的输入。如果您也在同一代码中插入数据,则可以在插入时计算频繁项
下面是一个伪C解决方案:
int counts[1000000];
while(each number as n)
{
counts[n]++;
// then insert number into array
}
编辑#2:确保将数组中的所有项初始化为零,以免得到意外结果。请记住这是一个O(n^2)算法最好,也可能更糟。这意味着操作的数量与项的平方数成正比。在一定数量的行之后,性能将迅速下降,除了改进算法之外,您别无选择。Google Guava项目的实现在这种情况下可能很有用。您可以将项目存储在那里,然后使用每次出现的计数检索一组值。对这一项的算法进行了一些思考。以下是我提出的解决方案:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
public class NumberTotalizerTest {
public static void main(String args[]) {
HashMap<Integer,Integer> hashMap = new HashMap<Integer,Integer>();
// Number input
Random randomGenerator = new Random();
for (int i = 1; i <= 50; ++i ) {
int randomInt = randomGenerator.nextInt(15);
System.out.println("Generated : " + randomInt);
Integer tempInt = hashMap.get(randomInt);
// Counting takes place here
hashMap.put(randomInt, tempInt==null?1:(tempInt+1) );
}
// Sorting and display
Iterator itr = sortByValue(hashMap).iterator();
System.out.println( "Occurences from lowest to highest:" );
while(itr.hasNext()){
int key = (Integer) itr.next();
System.out.println( "Number: " + key + ", occurences: " + hashMap.get(key));
}
}
public static List sortByValue(final Map m) {
List keys = new ArrayList();
keys.addAll(m.keySet());
Collections.sort(keys, new Comparator() {
public int compare(Object o1, Object o2) {
Object v1 = m.get(o1);
Object v2 = m.get(o2);
if (v1 == null) {
return (v2 == null) ? 0 : 1;
}
else if (v1 instanceof Comparable) {
return ((Comparable) v1).compareTo(v2);
}
else {
return 0;
}
}
});
return keys;
}
}
import java.util.ArrayList;
导入java.util.Collections;
导入java.util.Comparator;
导入java.util.HashMap;
导入java.util.Iterator;
导入java.util.List;
导入java.util.Map;
导入java.util.Random;
公共类NumberTotalizerTest{
公共静态void main(字符串参数[]){
HashMap HashMap=新的HashMap();
//数字输入
Random randomGenerator=新的Random();
对于(int i=1;i什么是lineCounter
和lineitem1
)?lineCounter是事务的总行数。lineitem1是一个数组,用于记录项目(即数字)每行中的数字。项目的最大/最小值是多少?请参阅下面的解决方案。看看它的性能会有多好会很有趣。我使用缓冲读取器从.dat文件中读取数字行,然后将数字存储在2d数组中。使用此计数数组的意义是什么?要获得计数的数量,我仍然需要扫描array与循环时间相同是的,但是在添加数据的同时执行此操作,您不必再次扫描阵列,这将大大增加添加数据所需的时间。哦,我明白了,如果它有效,我会尝试,但我认为时间不会减少太多,谢谢:)@托马斯O:在java中,它总是0)你不需要将所有项初始化为零。是的,我知道这个循环很耗时,关键是可以使用其他算法来排序。你是如何获取数据的?数据一旦获取就会发生变化吗?最初,数字行是从.dat文件读取的,我使用缓冲读取器将所有数字读入2d array(为了跟踪行号)。但是我必须跟踪特定项目出现的行,然后您可以使用多重映射和调用方法put(项目,行号)。这样,您不仅可以获得每个项目的计数,还可以获得行项目的值。此外,TreeMultimap实现只允许您为键设置Comparator,在这种情况下,您可以根据关联的出现次数对项目进行排序。