Pregunta

Quiero crear una lista 5 Top 5 pares de valor clave únicos ordenados de acuerdo con un valor.

He intentado crear un hashmap, pero como la lista original que leo de JSON está ordenada HashMap sobrescribe el último valor para que la clave tendrán el valor más pequeño en lugar del más grande.

La solución fue usar LinkedHashSet, para garantizar la singularidad y mantener el pedido.Pero como estoy almacenando una clave, los pares de valor, decidí crear una nueva clase y guardarlos como objetos.

Sé que tuve que implementar comparable pero aparentemente no hay comparación que ocurra y el LinkedHashSet no es único.

Mi código es:

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);
}

La salida es:

[Tipo= Monarch - Confianza= 79.447838, Tipo= Monarch - Confianza= 58.911613, Tipo= Monarch - Confianza= 56.614368, Tipo= Figura Fundación - Confianza en la Fundación= 48.796387, Tipo= Político - Confianza= 38.921349, Tipo= Reina Consort -Confianza= 36.142864]

¿Fue útil?

Solución

Creo que quiere decir que desea usar el treemap (mapa no configurado) para usar claves comparables para ordenarlas.LinkedHashSet es una colección de elementos que mantienen el orden en que se agregaron.

suena como lo que quieres es

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);
}

Otros consejos

Debe implementar Hashcode () también.
Cualquier persona que incluso considere la implementación de iguales () y hashcode () debe leer al menos este capítulo de Java efectivo o mejor aún todo el libro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top