2017-09-06 1 views
1

J'ai un JSONArray de la forme:correspondant multiple dans un JSONArray

[[{ "Country" : "IN", "count" : 10},{ "Country" : "US", "count" : 20}], [{ "Country" : "IN", "count" : 10},{ "Country" : "US", "count" : 20}], [{ "Country" : "IN", "count" : 10},{ "Country" : "US", "count" : 20}]] 

Je veux comparer des champs individuels comme dans le cas ci-dessus depuis { "Country" : "IN", "count" : 10} est égale à { "Country" : "IN", "count" : 10} et { "Country" : "IN", "count" : 10} et { "Country" : "US", "count" : 20} est égal à { "Country" : "US", "count" : 20} et { "Country" : "US", "count" : 20}, je devrais obtenir un résultat de match.

Cependant pour un cas comme ci-dessous, je devrais obtenir un résultat sans correspondance car le count ne correspond pas.

[[{ "Country" : "IN", "count" : 45},{ "Country" : "US", "count" : 60}], 
[{ "Country" : "IN", "count" : 10},{ "Country" : "US", "count" : 20}], 
[{ "Country" : "IN", "count" : 10},{ "Country" : "US", "count" : 20}]] 

J'ai été capable de mettre les données dans un HashMap. Mais je suis incapable de trouver un moyen, comment comparer.

myArray contient le JSONArray ci-dessus.

int length = myArray.getJSONArray(0).length(); 
Map<String, Integer> cargo = new HashMap<>(); 
for (int j = 0; j < myArray.length(); j++) { 
    for (int k = 0; k < myArray.getJSONArray(j).length(); k++) { 
    String country = myArray.getJSONArray(j).getJSONObject(k).getString(DataConstants.COUNTRY); 
    Integer count = myArray.getJSONArray(j).getJSONObject(k).getInt(DataConstants.COUNT); 
    cargo.put(country, count); 
    } 

} 

if (cargo.size() == length) { 
    System.out.println("Data Matched !!"); 
    return true; 
} 

else 
    System.out.println("Data Not Matched !!"); 
return false; 

Merci,

+3

Vous voudrez convertir vos tableaux JSON en objets Java et remplacer les méthodes égales et les méthodes de hachage. – alayor

+0

@alayor Y a-t-il un lien/code que vous pouvez pointer vers des méthodes oveeride égales et hashcode? – AYa

+0

@Aya: Il y avait quatre mots clés évidents dans le commentaire d'alayor. Taper « Java », « override », « égal », et « hashCode » dans Google de (ou de débordement de la pile) champ de recherche aurait été à la fois plus facile et plus rapide que de nous demander de le faire pour vous . –

Répondre

1

Créez un objet Pojo avec deux variables et remplacez la méthode equals.

public class Pays {

private String code; 
private int count; 
//getters, setters 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + ((code == null) ? 0 : code.hashCode()); 
    result = prime * result + count; 
    return result; 
} 
@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Country other = (Country) obj; 
    if (code == null) { 
     if (other.code != null) 
      return false; 
    } else if (!code.equals(other.code)) 
     return false; 
    if (count != other.count) 
     return false; 
    return true; 
} 

}

Maintenant, vous pouvez créer un HashMap d'objets POJO en mettant à jour votre code.

Country country = null; 
     for (int j = 0; j < myArray.length(); j++) { 
       for (int k = 0; k < myArray.getJSONArray(j).length(); k++) { 
       String country = myArray.getJSONArray(j).getJSONObject(k).getString(DataConstants.COUNTRY); 
       Integer count = myArray.getJSONArray(j).getJSONObject(k).getInt(DataConstants.COUNT); 
       country = new Country(); 
       country.setCode(country); 
       country.setCount(count); 
       cargo.put(country); //change cargo to take country objects 
       } 

      } 

Une fois que vous avez la liste des POJO, vous pouvez faire des égaux, contient et toute autre opération de fantaisie de connaître le match.

+0

Je convertis 'cargo' pour prendre des objets de pays comme ceci' Map cargo = new HashMap <>(); final ObjectMapper mapper = new ObjectMapper(); final Pojo de pays = mapper.convertValue (fret, Country.class); 'puis appel en tant que' cargo.putAll ((Carte ) country); '. Est-ce correct ? – AYa

+0

'Carte cargo = new HashMap ();'. Vous pouvez juste aller avec List. 'Liste cargo = new ArrayList ();' – yogidilip

+0

Merci. Maintenant, je peux convertir cela sans utiliser jackson. Une fois je l'ai dans hashmap 'cargo'. Je devrais juste itérer sur des clés similaires et vérifier si elles ont la même valeur pour l'appariement. Droite ? – AYa

2

Vous pouvez créer une classe nommée Pays que vous pouvez utiliser pour enregistrer les données de votre tableau de JSON.

class Country { 
private String countryCode; 
private int count; 

@Override 
public boolean equals(Object obj) { 
    // compare your properties 
} 

@Override 
public int hashCode() { 
    // Calculate a int using properties 
} 
} 

Jetez un oeil à this tutorial sur la façon de mettre en œuvre vos méthodes equals et hashcode.

Ensuite, vous devez convertir votre tableau JSON en objets Java. Jetez un oeil à this tutorial.

+0

Pourquoi dois-je implémenter la méthode 'hashcode'? Je veux dire que je peux juste avoir la méthode d'égal à égal puisque je ne me préoccupe que de comparer les valeurs après avoir mis dans la carte du pays. – AYa

+2

Jetez un oeil à cette réponse: https: // stackoverflow.com/a/2265637/3800170 – alayor