1

値に従ってソートされた一意のキーと値のペアのトップ 5 リストを作成したいと考えています。

ハッシュマップを作成しようとしましたが、JSON から読み取った元のリストがソートされているため、ハッシュマップは最後の値を上書きするため、キーは最大値ではなく最小値になります。

解決策は、LinkedHashSet を使用して一意性を確保し、順序を維持することでした。しかし、キーと値のペアを保存しているので、新しいクラスを作成してオブジェクトとして保存することにしました。

私は同等のものを実装しなければならなかったことを知っていますが、明らかに比較は行われておらず、LinkedHashSet は一意ではありません。

私のコードは次のとおりです。

public class cellType implements Comparable<Object> {

private String type;
private double confidence;

@Override
public String toString() {
    return "type=" + type + " - confidence=" + confidence ;
}

public cellType(String type, double confidence) {
    super();
    this.type = type;
    this.confidence = confidence;
}
public String getType() {
    return type;
}
public void setType(String type) {
    this.type = type;
}
public double getConfidence() {
    return confidence;
}
public void setConfidence(double confidence) {
    this.confidence = confidence;
}
@Override
public boolean equals(Object obj) {
    if (!(obj instanceof cellType)) {
          return false;
        }
    cellType ct = (cellType) obj;
    return type.equals(ct.getType());
}
@Override
public int compareTo(Object o) {
    cellType ct = (cellType) o;
    return type.compareTo(ct.getType());
}

}

    public static void main(String args[]) throws IOException, JSONException {
    String freebaseAddress = "https://www.googleapis.com/freebase/v1/search?query=";
    System.setProperty("https.proxyHost", "proxy");
    System.setProperty("https.proxyPort", "8080");
    JSONObject json = readJsonFromUrl(freebaseAddress + "apple");
    LinkedHashSet<cellType> rich_types = new LinkedHashSet<cellType>();
    JSONArray array = json.getJSONArray("result");
    for (int i = 0; i < array.length(); i++) {
        if (array.getJSONObject(i).has("notable")) {
            JSONObject notable = new JSONObject(array.getJSONObject(i)
                    .getString("notable"));
            if (rich_types.size() <= 5)
                rich_types.add(new cellType(notable.getString("name"), (Double) array.getJSONObject(i).get("score")));
        }
    }
    System.out.println(rich_types);
}

出力は次のとおりです。

[タイプ=君主 - 信頼度=79.447838、タイプ=君主 - 信頼度=58.911613、タイプ=君主 - 信頼度=56.614368、タイプ=創設者 - 信頼度=48.796387、タイプ=政治家 - 信頼度=38.921349、タイプ=王妃 - 信頼度=36.142864 ]

4

2 に答える 2

1

hashCode() も実装する必要があります。
equals() と hashCode() の実装を考えている人は、少なくともEffective Java のこの章か、できれば本全体を読む必要があります。

于 2012-02-27T13:57:42.793 に答える
1

TreeMap (Map not Set) を使用して Comparable キーを使用して並べ替えたいということだと思います。LinkedHashSet は、追加された順序を保持する要素のコレクションです。

それはあなたが望むもののように聞こえます

if (rich_types.size() <= 5) {
    cellType ct = new cellType(notable.getString("name"), (Double) array.getJSONObject(i).get("score"));
    if(!rich_type.contains(ct))
        rich_types.add(ct);
}
于 2012-02-27T13:58:36.130 に答える