2016-12-14 8 views
-1

文字列のArrayList(単語の順序と単語の文字)をシャッフルするシャッフルクラスがありますが、shuffle()メソッドがshuffleWords()メソッドにアクセスしているようです実際の単語とcompToWordsはシャッフルされた実際の単語と同じですが、実際にはcompToWordsだけが必要です。ArrayListがアクセスされずに編集中

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

あなたはshuffleWords(realWords)に渡しているが、ノーどこにrealWordsのコピーを作成しなかったので、あなたは元のリストを操作しています。

ソリューション:

インサイドshuffleWords入力リストのコピーを作成します:Passing Information to a Method or a Constructor

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

も、このJavaチュートリアルの "渡すリファレンスデータ型引数" セクションを参照してください。

シャッフルの最初の行で
+0

ありがとうございます!それが起こる可能性があるとは思わなかった – Carson

0

()、あなたは

compToWords = shuffleWords(realWords); 

を使用これは、リストcompToWordsがshuffleWordsによって返されたリストを参照します。この場合のshuffleWordsによって返されるリストは、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; 
} 

ここで、このコードでは、arraylistの単語はまだrealWordsを参照しています。この場合の単語の変更は、realWordsにも当てはまります。

代わりに、最も簡単な解決策は、リストのコピーをshuffleWordsで作成することです。作成した配列リストは元の配列リストへの参照としてのみ役立ちます。

関連する問題