テキストファイルから何千もの文字列を入力しようとしていて、最も人気のある文字列をランク付けすることができます。 各文字列の数がどのくらいあるかを把握する方法がわかりません。文字列がJavaハッシュテーブルに表示される回数
リンクリストなどの別のADTを実装する必要がありますか? ArrayList以外のJavaライブラリは使用できません。
これまで私がこれまで持っていたことは次のとおりです。
public class StudentTrends implements Trends {
int entries = 0;
//ArrayList<Integer> list;
String[] table;
int arraySize;
public StudentTrends() {
//this.list = new ArrayList<Integer>();
this.table = new String[10];
Arrays.fill(table, "-1");
}
//Method I'm having trouble with
@Override
public void increaseCount(String s, int amount) {
int key = horner(s);
if(table[key] == null){
entries++;
//table[key] = table[key];
}
else{
amount += 1+amount;
}
}
/**
* The hashing method used
* @param key
* Is the String inputed
* @param size
* Size of the overall arraylist
* @return
* The int representation of that string
*/
private int horner(String key){
int val = 0;
for(int a = 0; a < key.length(); a++){
val = ((val << 8) | (a)) % table.length;
}
table[val] = key;
return val;
}
ここに実装する必要のあるインターフェイスがあります。 投稿には重要ではありませんが、私がしようとしていることをよりよく理解するために使用できます。
public interface Trends {
/**
* Increase the count of string s.
*
* @param s String whose count is being increased.
* @param amount Amount by which it is being increased.
*/
public void increaseCount(String s, int amount);
/**
* Return the number of times string s has been seen.
* @param s The string we are counting.
* @return int The number of times s has been seen thus far.
*/
public int getCount(String s);
/**
* Get the nth most popular item based on its count. (0 = most popular, 1 = 2nd most popular).
* In case of a tie, return the string that comes first alphabetically.
* @param n Rank requested
* @return string nth most popular string.
*/
public String getNthMostPopular(int n);
/**
* Return the total number of UNIQUE strings in the list. This will NOT be equal to the number of
* times increaseCount has been called, because sometimes you will add the same string to the
* data structure more than once. This function is useful when looping through the results
* using getNthPopular. If you do getNthPopular(numEntries()-1), it should get the least popular item.
* @return Number of distinct entries.
*/
public int numEntries();
}。
効率的には、ソート可能なハッシュマップが理想的だと思います。 TreeMapは、SortedMapを実装する構造体です。 http://stackoverflow.com/questions/7427758/how-to-use-sortedmap-interface-in-java –
おそらく、文字列をキーとしてハッシュテーブルのようなものを実装する必要があります。文字列が挙げられる。私は、リストがここに役立つとは思わない。最も人気のある文字列が1つだけ必要な場合は、単一の参照でそれを追跡できます。ただし、すべての文字列が必要な場合は、すべてのエントリをテーブルから取り出し、数に基づいて並べ替えて、それを「最も一般的な」リストとして使用する必要があります。 – markspace
私はTreeMapがうまくいくとは思わない。あなたがツリーに入った後にカウントを増やす必要があります。これは、ツリー上のオーダーを混乱させます。つまり、各エントリを削除し、その数を増やしてから、ツリーに再度挿入する必要があります。私はそれをテストしていませんが、すべてのエントリがカウントされた後の1つの高速な並べ替えは私にとってより効率的な音です。 – markspace