Вопрос

Я хочу создать верхний 5 списка уникальных пар ключа, сортированных в соответствии с значением.

Я попробовал создать hashmap, но поскольку исходный список, который я читал из json, сортируется hashmap, перезаписывает последнее значение, поэтому они будут иметь наименьшее значение вместо самого большого.

Решение было использование 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]

Это было полезно?

Решение

Я думаю, что вы имеете в виду, что вы хотите использовать TREEWAP (карта, не устанавливающая), чтобы использовать сопоставимые клавиши для сортировки их.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);
}
.

Другие советы

Вам нужно реализовать hashcode () тоже.
Любой, кто даже считает реализацию равных () и Hashcode (), необходимо прочитать, по крайней мере, в этой главе эффективной Java или лучше, но всю книгу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top