我有一个shuffle类来调整字符串的ArrayList(单词的顺序和字母),但是,似乎方法shuffle()访问shuffleWords()方法,它设置的realWords和compToWords等于shuffled realWords,当真的只有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)));
}
}
答案 0 :(得分:1)
你正在传递shuffleWords(realWords)
,但是没有你在哪里复制了realWords,所以你正在操纵原始列表。
<强>解决方案:强>
里面的shuffleWords会复制输入列表:
private static List<String> shuffleWords(List<String> input) {
List<String> word = new ArrayList<>(input);
/* ... */
}
另请参阅&#34;传递参考数据类型参数&#34;本Java教程中的部分:Passing Information to a Method or a Constructor。
答案 1 :(得分:0)
在shuffle()的第一行,你使用
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中制作列表的副本,否则您创建的数组列表将仅用作对原始数组列表的引用。