1

我想创建根据值排序的唯一键值对的前 5 个列表。

我曾尝试创建一个 Hashmap,但由于我从 JSON 读取的原始列表已排序,Hashmap 会覆盖最后一个值,因此它们的键将具有最小值而不是最大值。

解决方案是使用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);
}

输出是:

[type=君主-信心=79.447838,type=君主-信心=58.911613,type=君主-信心=56.614368,type=建国图-信心=48.796387,type=政客-信心=38.921349,type=王后-信心=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 回答