2015-12-11 206 views
1

我有以下代碼。我想要做的是使用排列函數填充ArrayList,將該數組保存在HashMap中,並重新開始整個過程​​(基本上使用ArrayList爲每個鍵填充HashMap)。我發佈了下面的代碼,但它不起作用。我認爲這是因爲它存儲了與我已經聲明的列表相同的引用,而不是製作它的副本。我是C磨砂和Java新手,所以任何幫助表示讚賞!在HashMap中存儲ArrayList

public class Anagrams 
{ 
    public static HashMap<String, ArrayList<String>> permutacii = new HashMap<String, ArrayList<String>>(); 
    public static ArrayList<String> tempList = new ArrayList<String>(); 


private static void permutation(String prefix, String str) 
{ 
    int n = str.length(); 
    if (n == 0) 
     tempList.add(prefix); 
    else 
    { 
     for (int i = 0; i < n; i++) 
      permutation(prefix + str.charAt(i), 
     str.substring(0, i) + str.substring(i+1)); 
    } 
} 

public static void main(String[] args) { 
    findAll(System.in); 
} 

public static void findAll(InputStream inputStream) 
{ 
    Scanner scanner = new Scanner(inputStream); 
    while(scanner.hasNextLine()) 
    { 
     String line = scanner.nextLine(); 
     permutation("", line); 
     permutacii.put(line, tempList); 
     tempList.clear(); 
    } 
} 
} 
+0

所有列表在HashMap中都是空的。 – Hydroxis

+0

您需要在將地圖放入地圖後每次初始化一個新的'ArrayList'。 – user1803551

回答

4

您只有一個列表,其中您在HashMap中存儲了多個引用。並且在每次迭代結束時清除該List。

一種可能的方法來解決你的問題:

while(scanner.hasNextLine()) 
{ 
    String line = scanner.nextLine(); 
    tempList = new ArrayList<String>(); 
    permutation("", line); 
    permutacii.put(line, tempList); 
} 

但我認爲,如果你做tempList一個局部變量的代碼將更具可讀性和它作爲參數傳遞給permutation方法:

while(scanner.hasNextLine()) 
{ 
    String line = scanner.nextLine(); 
    ArrayList<String> tempList = new ArrayList<String>(); 
    permutation("", line, tempList); 
    permutacii.put(line, tempList); 
} 

,並修改相應permutation

private static void permutation(String prefix, String str, ArrayList<String> tempList) 
{ 
    int n = str.length(); 
    if (n == 0) 
     tempList.add(prefix); 
    else 
    { 
     for (int i = 0; i < n; i++) 
      permutation(prefix + str.charAt(i), 
         str.substring(0, i) + str.substring(i+1), 
         tempList); 
    } 
} 
+0

我試圖將它作爲參數添加到置換函數中,但我不確定如何編輯它,因爲Java中沒有指針。現在測試第一部分:) – Hydroxis

+0

[] - 我仍然得到空輸出:| – Hydroxis

+0

@Hydroxis您是否刪除了'tempList.clear()'語句?我測試了代碼,它的工作原理。 – Eran