无需访问即可编辑ArrayLists

时间:2016-12-14 18:37:29

标签: java arraylist

我有一个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)));
} 
}

2 个答案:

答案 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中制作列表的副本,否则您创建的数组列表将仅用作对原始数组列表的引用。