ArrayList of ArrayLists: confusión clara de funciones

Aquí hay un método particular que he escrito:

class A {

    private static ArrayList<ArrayList<Integer>> inputTerms = new ArrayList<ArrayList<Integer>();

    public static void method1(ArrayList<Integer> terms) {
        ArrayList<Integer> clauses = new ArrayList<Integer>();
        int N = terms.size();
        for (int i = 0; i < N - 1; i++) {
            for (int j = i + 1; j < N; j++) {
                clauses.add(-terms.get(i));
                clauses.add(-terms.get(j));
                inputTerms.add(clauses);
                clauses.clear();
            }
        }
    }
}

Este método se llama varias veces desde la función principal. Al final, trato de escribir el contenido de la variable de clase en un archivo. Sin embargo, cuando hago esto, obtengo 0 como contenido de inputTerms. Sin embargo, si elimino la línea clauses.clear (), puedo obtener los valores apropiados.

Mi programa es tal que es vital para mí borrar las cláusulas después de agregar a inputTerms. ¿Hay alguna alternativa a esto?

** Hmmm .. He hecho lo que me has sugerido. Sin embargo, no he superado el problema. Para dar más antecedentes, en mi función principal, tengo el siguiente código:

for (int i=0; i<N-1; i++){ 
ArrayList<Integer> firstdiagonalTerms = new ArrayList<Integer>(); 
for (int j=0; j<N-i; j++){ 
firstdiagonalTerms.add(variable[j][i+j]); 
} 
method1(firstdiagonalTerms);
} 

Tengo que llamar a la función method1 4 veces para diferentes combinaciones de 'i' y 'j'. Sin embargo, todavía obtengo 0 cuando uso las sugerencias mencionadas anteriormente **

Respuesta 1

Está agregando la misma lista y borrándola repetidamente. Cuando agrega un objeto a una lista, copia una referencia a él, no una copia del objeto.

int N = terms.size();
for (int i = 0; i < N - 1; i++) {
    for (int j = i + 1; j < N; j++) {
        List<Integer> clauses = new ArrayList<Integer>();
        clauses.add(-terms.get(i));
        clauses.add(-terms.get(j));
        inputTerms.add(clauses);
    }
}

o

for (int i = 0, N = terms.size(); i < N - 1; i++) 
    for (int j = i + 1; j < N; j++) 
        inputTerms.add(Arrays.asList(-terms.get(i), -terms.get(j)));
Respuesta: 2

No estoy seguro de entender lo que estás tratando de lograr, pero sigues reutilizando la misma lista, que probablemente no sea lo que querías hacer.

Probablemente deberías mover el ArrayList<Integer> clauses = new ArrayList<Integer>();interior del bucle interno y no llamar clauses.clear()en absoluto.

Respuesta: 3

Cuando agrega "cláusulas", agrega el objeto real a la matrizLista, no una copia. Entonces, cuando los borre, se eliminarán todos los valores de la lista. Para solucionar esto, agregue un clon de la lista:

inputTerms.add((ArrayList<Integer>) clauses.clone());
Respuesta: 4

Estoy desarrollando una apariencia con dos temas. El problema es: quiero poder cambiar dinámicamente entre los dos temas (significa cambiar los temas después del inicio). Pero los temas tienen dos ...

Pensé que el objetivo de upsert era reemplazar un documento que ya existe. Si no creo ningún campo como único, simplemente inserta 2 documentos separados. Si hago un campo único como ...

He escrito un programa que realiza una búsqueda de la palabra hindi dada en la base de datos mysql y recupera su nombre correspondiente en inglés que se almacena en la base de datos. Funciona bien cuando doy ...

Actualmente estoy tratando de compilar un proyecto usando ant que usa varias bibliotecas externas (específicamente apache.hwpf y JDom2) distribuidas como archivos .class. Actualmente estoy usando eclipse para editar ...