En el siguiente código tengo dos listas de objetos de imagen (fromTagList y fromImageList). La clase de imagen tiene una URL de imagen de atributo. Hay objetos comunes en ambas listas.

Mi objetivo es detectar estos elementos comunes de acuerdo con su propiedad de URL y eliminarlos de ambas listas, de modo que ambas listas contengan elementos distintos juntos y luego fusionaré las dos listas con una lista para que esta lista combinada contenga objetos distintos. El problema es que el siguiente método que utilicé no eliminó todos los elementos comunes porque creo que omitirá algunos índices.

for (int i = 0; i < fromTagList.size(); i++) {
    for (int k = 0; k < fromImageList.size(); k++) {
        if (fromTagList.get(i).getImageURL().equals(fromImageList.get(k).getImageURL())) {
            fromTagList.remove(i);
            fromImageList.remove(k);
        }
    }
}
0
wisam 10 may. 2019 a las 22:31

4 respuestas

La mejor respuesta

.remove (index) quita el elemento, lo que hace que la lista sea más corta, pero su índice no lo considera, y sigue agregando 1, pero en realidad pasa por encima de 2 elementos (el +1 y el eliminado).

Esto funciona para la eliminación en línea de los elementos repetidos, pero falla cuando una lista contiene elementos repetidos. Funciona para el caso donde no hay elementos repetidos dentro de una lista, porque paso por los elementos al revés. Tenga en cuenta la etiqueta continuar.

//the new ArrayList is needed so remove is supported
    List<String> fromTagList = new ArrayList(Arrays.asList(new String[] {"a", "b", "c", "1", "2", "3"}));
    List<String> fromImageList = new ArrayList(Arrays.asList(new String[] {"b", "b", "c", "d", "2", "3", "4"}));

    outer: for (int i = fromTagList.size()- 1; i >= 0; i--) {
        for (int k = fromImageList.size() - 1; k >= 0; k--) {
        System.out.println("i: " + i + " k: " + k);
        if (fromTagList.get(i).equals(fromImageList.get(k))) {
            fromTagList.remove(i);
            fromImageList.remove(k);
            continue outer;
        }
        }
    }

    System.out.println("fromTag  : " + fromTagList);
    System.out.println("fromImage: " + fromImageList);

No creo que pueda eliminar a medida que avanza si desea admitir listas con elementos repetidos. Sugiero agregar a una nueva lista de elementos para eliminar.

1
Jose Jimenez 10 may. 2019 a las 20:04

Sí, tienes un problema con Index, el problema es cuando eliminas algo de la lista, por ejemplo, en la posición i = 10, el elemento de la posición 11 estará en el 10 y yo estaré en el 11, por lo que perderás este elemento , el segundo problema es cuando elimina de la segunda lista de k indexer, debe interrumpir, para no procesar todos los elementos restantes (a menos que el elemento encontrado no esté duplicado), así que aquí está mi respuesta que funciona para mí después de probar su código :

for (int i = 0; i < fromTagList.size(); i++) {
            for (int k = 0; k < fromImageList.size(); k++) {
                if (fromTagList.get(i).getImageURL().equals(fromImageList.get(k).getImageURL())) {
                    fromTagList.remove(i);
                    fromImageList.remove(k);
                    i--;
                    //break; this is optional
                }
            }
        }
0
Younes Charfaoui 10 may. 2019 a las 20:04

Siempre que necesite mantener elementos uniq, considere usar Set <>. La interfaz de conjunto en Java está diseñada específicamente para manejar elementos uniq. Puede seguir el siguiente enfoque para convertir las listas en un conjunto:

Anule el método de igual y hashcode para el objeto de imagen (use solo el atributo url como condición para la igualdad y el hascode). Ahora agregue ambas listas a un conjunto. Convierta el conjunto de nuevo en una lista y listo! Ejemplo:

 class ImageObj {

    String url;
    //rest of the stuff

    @Override
    public boolean equals(Object o){
    ImageObj that = (ImageObj)o;
    return that.url.equals(this.url);
    }
    @Override
    public int hascode(){
    return Objects.hascode(this.url);
    }
    }
    }

Entonces--

Set<ImageObj> set= new HashSet<ImageObj>(fromTagList);
set.addAll(fromImageList);

List<ImageObj> list = new ArrayList<ImageObj>(set);

Esta es su lista final que contiene todos los objetos únicos.

0
Malkeith Singh 10 may. 2019 a las 20:05

Yo crearía un diccionario. Iterar a través de cada lista (por separado). Para cada objeto, insértelo en el diccionario con la clave como su URL. De esta forma, cualquier objeto con la misma URL aparecerá como un par clave-valor en el diccionario. Después de agregar todo al diccionario, conviértalo en una lista.

0
TimWeri 10 may. 2019 a las 19:37