1

Tengo un método para verificar el contenido de un JSONArray, su función es verificar cuantas veces aparece cierto valor en una clave específica del array y contabilizar cuantos valores diferentes hay para todo el array.

El JSONArray tiene el siguiente formato:

{"array":[  
  {"package":"com.example.1","resource":"permissions"},  
  {"package":"com.example.1","resource":"image"},  
  {"package":"com.anotherexample.2","resource":"permissions",  
  {"package":"com.anotherexample.2","resource":"image"}  
]}

Entonces utilizo Gson para parsear este JSONArray a una clase personalizada preparada para recibir estos datos. Me saltaré el código de la clase para evitar llenar la pregunta de código.
Ya verifiqué y se parsea correctamente, todo el arreglo se guarda correctamente en un objeto de tipo List así que el error no está acá...

Ahora, quiero determinar por ejemplo, cuantas veces aparece el package con el valor com.example.1 para determinar cuantos paquetes diferentes contiene el array. Para esto tengo el método siguiente:

public int getPackagesCount(List<MiClaseParaParsear> array) {  
  int result = 0;  
  String control = "";  
  int count = array.size();  
  for(int x =0; x < count; x++) {  
      if(array.get(x).getPackage() == control) {  
      // aquí no hago nada porque en teoría el paquete ya fue contabilizado  
      } else {  
      // aquí aumento en 1 el conteo de package con valores diferentes  
          result++;  
      // luego asigno a la variable control el valor del package actual para que sirva en el comparador del if, al menos en teoría  
          control = array.get(x).getPackage();  
      }  
  }  
  return result;  
}

En teoría, lo que este método hace, es ir recuperando uno a uno los valores de package para cada objeto MiClaseParaParsear y compararlos con la variable control para verificar si ese valor de package ya fue contabilizado anteriormente, si es así, no realiza ninguna acción y vuelve al inicio del bucle for, pero si no ha sido contado entonces aumenta en 1 el valor de result que es quien lleva el conteo de los nuevos valores encontrados y asigna el contenido de la clave package a la variable control para que de esta forma en el if ahora se compare con este valor y así determinar si ya fué contado o no.

Usando Log() he logrado ver que si almacena de forma correcta el valor extraído del List, aumenta correctamente el valor de result, pero lo que no hace y no entiendo por qué, es comparar de forma correcta el if. Me explico:
Cuando entra al if, aunque el valor de array.get(x).getPackage() sea igual al valor contenido en control, sigue arrojando false y por ende sigue contabilizando el ppackage aunque este ya haya sido contado, entonces, si tengo un array con 20 valores que se reparten entre 4 package diferentes, el método me devuelve 20 que es el número total de items en el array y no 4 que sería la cantidad de package diferentes que existen en el array.

Como podría hacer lo que busco, o por qué es que el if al parecer no compara de forma correcta los valores?, ya verifiqué que las variables coincidan entre si, al hacer array.get(x).getPackage() obtengo un String, y la variable control también es de tipo String...

Gracias de antemano.

Jorgesys
  • 103,630
  • 13
  • 52
  • 124

2 Answers2

3

para comparar cadenas se usa .equals()

en tu caso seria: if(array.get(x).getPackage().equals(control))

userStack
  • 6,330
  • 3
  • 20
  • 41
1

El problema radica en la comparación que realizas

if(array.get(x).getPackage() == control) {  

el método equals() es el indicado para realizar la comparación entre valores tipo String

if(array.get(x).getPackage().equals(control)) {  

Puedes revisar esta pregunta: Como comparar correctamente Strings en Java.

Jorgesys
  • 103,630
  • 13
  • 52
  • 124
  • Gracias por tu respuesta pero el problema no está al leer el json pues eso sí lo puedo hacer y justamente como explico lo parseo a una lista utilizando una clase personalizada preparada para recibir el contenido y el problema viene únicamente en el if Pues siempre me da false al comparar los String – Paris N. Salguero Mar 02 '17 at 03:52
  • Veo usas Gson para obtener los datos, revisa la respuesta tu problema se encuentra en una incorrecta comparación. @ParisN.Salguero – Jorgesys Mar 02 '17 at 04:01
  • Es irrelevante de donde obtienes las las cadenas, la comparación por valor se realiza mediante el operador .equals, la comparación utilizando == también funciona en cadenas pero únicamente si asignaste el valor de las cadenas utilizando literales http://es.stackoverflow.com/a/41581/25849 – Carlos Lucero Mar 02 '17 at 15:28
  • Se que es irrelevante que use Gson u otra clase del SDK, solo era un commentario ya que incialmente le sugerí usara JSONObject para obtener los datos. – Jorgesys Mar 02 '17 at 16:01