Tengo una clase de reproducción aleatoria para mezclar una ArrayList of Strings (orden de palabras y letras de las palabras), sin embargo, parece que el método shuffle () accede al método shuffleWords (), establece realWords AND compToWords igual a las palabras reales barajadas, cuando realmente solo debería ser compToWords.

import java.util.*;
import java.lang.*;
public class Shuffle{

private static ArrayList<String> realWords = new ArrayList<String>();
private static ArrayList<String> shuffWords  = new ArrayList<String>();
private static ArrayList<String> compToWords = new ArrayList<String>();

private static ArrayList<String> shuffleWords(ArrayList<String> word){
    for (int k = word.size()-1; k>= 0; k--){
        int r = (int)(Math.floor(Math.random() * k));
        String temp = word.get(r);
        word.set(r,word.get(k));
        word.set(k,temp);
    }
    return word;
}
private static String shuffleLetters(String word){
    StringBuilder str = new StringBuilder(word);
    for (int k = word.length()-1; k>= 0; k--){
        int r = (int)(Math.floor(Math.random() * k));
        char temp = str.charAt(r);
        str.setCharAt(r, str.charAt(k));
        str.setCharAt(k,temp);
    }
    return str.toString().toLowerCase();
}
public static void shuffle(){
    compToWords = shuffleWords(realWords);
    for(int i = 0; i <compToWords.size();i++)shuffWords.add(shuffleLetters(compToWords.get(i)));
} 
}
-1
Carson 14 dic. 2016 a las 21:37

2 respuestas

La mejor respuesta

Está pasando shuffleWords(realWords) pero no dónde hizo una copia de realWords, por lo que está manipulando la lista original.

Solución:

Dentro de shuffleWords hacen una copia de la lista de entrada:

private static List<String> shuffleWords(List<String> input) {
    List<String> word = new ArrayList<>(input);
    /* ... */
}

Consulte también la sección "Pasar argumentos de tipo de datos de referencia" en este tutorial de Java: Pasar información a un método o un constructor.

1
Patrick Parker 14 dic. 2016 a las 19:06

En la primera línea de shuffle (), usa

compToWords = shuffleWords(realWords); 

Esto hace que la lista compToWords se refiera a la lista devuelta por shuffleWords. La lista devuelta por shuffleWords en este caso es realWords.

private static ArrayList<String> shuffleWords(ArrayList<String> word){
for (int k = word.size()-1; k>= 0; k--){
    int r = (int)(Math.floor(Math.random() * k));
    String temp = word.get(r);
    word.set(r,word.get(k));
    word.set(k,temp);
}
return word;
}

En este código, la palabra lista de arrays todavía se refiere a palabras reales. Los cambios que realice en Word, en este caso, también se aplican a realWords.

En cambio, la solución más fácil sería hacer una copia de su lista en shuffleWords; de lo contrario, la lista de matrices que cree solo servirá como referencia a la lista de matrices original.

0
NFK 14 dic. 2016 a las 19:18