2017-05-25 99 views
1

爲什麼隨機生成的值在數組中相同?當我將它們放入數組時,爲什麼我的隨機生成的值相同?

當我在調試模式下查看時,我看到ArrayList<String>中的值相同。

可以請任何人解釋這一點?

public class CreateRandomSet { 
    public static void main(String[] args) throws IOException { 
     Map<String, ArrayList<String>> randomSet = new HashMap<String, ArrayList<String>>(); 
     ArrayList<String> storeData = new ArrayList<String>(); 
     String fileName = "file.txt"; 
     FileReader fileReader = new FileReader(fileName); 
     BufferedReader bf = new BufferedReader(fileReader); 
     String line = bf.readLine(); 
     String storeId; 
     String storeName; 
     String customer; 
     String value; 
     Random random = new Random(); 
     double randomValue; 
     double start = 100; 
     double end = 10000; 
     while(line != null){ 
      storeData.clear(); 
      line = line.trim(); 
      CsvTokenizer csvTokenizer = new CsvTokenizer(line, ","); 
      storeId = csvTokenizer.nextToken(); 
      if(csvTokenizer.hasMoreTokens()){ 
       storeName = csvTokenizer.nextToken(); 
       storeData.add(storeName); 
      } 
      if(csvTokenizer.hasMoreTokens()){ 
       value= csvTokenizer.nextToken(); 
       randomValue = end + (start * random.nextDouble()) ; 
       storeData.add(String.valueOf(randomValue)); 
      } 

      randomSet.put(storeId, storeData); 
      line = bf.readLine(); 
     } 
    } 
} 

回答

2

您只有一個storeData實例,您將其用作地圖所有鍵的值。因此,在最終迭代中添加到List的值是您爲地圖的所有鍵看到的值。

您必須在循環的每次迭代中創建一個新的List

變化:

storeData.clear(); 

到:

storeData = new ArrayList<>(); 
+0

很有意思,謝謝你。 – Andrew

+0

但爲什麼'clear()'根本不清除數組?我期待在我使用'clear()'方法後我的數組將被清空。 – Andrew

+1

@Andrew當然它會清除列表。但是,映射中的所有值都指向同一個ArrayList對象,因此它將清除所有這些對象。並且您在上次迭代中添加的值不會被清除。 – Eran

相關問題