0

入力文字列のキャッシュを作成し、それらをリストにロードし、そのリスト内の各文字列の出現回数を決定し、最も一般的な要素の順にランク付けするメソッドをいくつか構築しています。

文字列または要素自体は、JUnit テストからのものです。と呼ばれるメソッドを呼び出しています

lookupDistance(dest)

ここで、「dest」は文字列 (目的地の空港コード) で、lookupDistance は 2 つの空港コード間の距離を返します....

背景があります。問題は、すべての「dest」文字列をキャッシュにロードしたいということです。それを行う最善の方法は何ですか?

次のメソッドを持つスケルトン コードがあります。

public List<String> mostCommonDestinations()
  1. 「dest」文字列を透過的にリストに追加するにはどうすればよいですか? JUnit テスト ケースは lookupDistance(dest) のみを呼び出しているため、このメソッドでこれらの「dest」文字列をリストにリダイレクトするにはどうすればよいでしょうか?

  2. 次に、各要素の出現回数を定量化し、上位 3 つまたは 4 つをランク付けするにはどうすればよいでしょうか?

4

2 に答える 2

0

起動時に既知の宛先を追加し、到着時に新しい文字列をキャッシュに追加し続けることができます。それは一つの方法です。もう 1 つの方法は、要求されたときに文字列をキャッシュし、将来の要求のために保持することです。その場合、lookupDistance文字列もキャッシュする必要があります。

Hashmap を含む小さなクラスを作成することから始めます。キーは目的の文字列であり、値は、複数の情報を保持する場合はオブジェクトにするか、その文字列が使用された回数を指定する数値にすることができます。データオブジェクトを使用することをお勧めします。以下のコードは単なるアイデアであり、疑似コードのようなものであることに注意してください。

class Cache {
private Hashmap<String, CacheObject>;

public void Add(string, CacheObject);
public CacheObject Lookup(string);
public CacheObject Remove(string);
public static Cache getInstance(); //single cache
}

class CacheObject {
public int lookupCount;
public int lastUsed;
}

あなたlookupDistanceは簡単に行うことができます

if(Cache.getInstance().Lookup(string) == null) {
Cache.getInstance().Add(string, new CacheObject() { 1, Date.now});
}
于 2013-06-26T21:33:42.090 に答える
0
  1. 持っているMap<String, Integer> destinations = new HashMap<>();

  2. lookupDistance(dest)、次のようにします (テストされていない疑似コード)。

    整数カウント = destinations.get(dest); if (count == null) { destinations.put(dest, Integer.valueOf(1)); } else { count = Integer.valueOf(count.intValue() + 1); }

このようにして、それぞれの出現回数を数えますdest

  1. マップを調べて、最大数を見つけます。それは少しトリッキーです。1つのアプローチは次のとおりです。

    リスト> リスト = 新しい ArrayList<>(); list.addAll(destinations.entrySet()); // これで「エントリ」のリストができました。それぞれが dest からそれぞれのカウンタにマップされます。 // そのリストはソートする必要があります。

この呼び出しで使用したコンパレーターは、まだ作成する必要があります。リストの要素である 2 つの引数を取り、それらのカウンター値に従ってそれらを比較する必要があります。ルーチンがsort残りを行います。

Comparator<Map.Entry<String, Integer>> comparator = new Comparator<>() {
    public @Override int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b) {
        return a.getValue().intValue() - b.getValue().intValue();
    }
}

わかりました。これで、上位 5 つ程度を選択できるソートされた s ができましたListEntryそれだけだと思ってください。これはすべて、本来よりも複雑に見えるので、他の解決策に興味があります。

于 2013-06-26T21:57:21.257 に答える