2016-03-30 116 views
2

這段代碼一直返回false,我找不到原因。Java Hashset返回false而不是true

List<String> angry = new ArrayList<String>(); 
while ((anger = angerSt.readLine()) != null) { 
    angry.add(anger); 
} 
angerSt.close(); 
String[] angrywords = angry.toArray(new String[0]); 
String word = "mad" 
Set<String> angryWordSet = new HashSet<String>(Arrays.asList(angrywords)); 
if(angryWordSet.contains(word)) 
{ 
    System.out.print("Yes"); 
    return true; 
} 
else return false; 

angryWordSet包含字符串瘋狂,生氣,鐵青和發煙。我打印出來以確保它在那裏。儘管如此,我仍然不明白。有人可以幫忙嗎?

+2

你確定線路不是'瘋狂'即ie。具有空間或特殊性質?你能打印出集合中每個字符串的長度嗎? –

回答

3

我認爲,您必須檢查每個angryWordSet元素是否存在前導和尾隨空格。

for (String s : angryWordSet) { 
    if (s.trim().equals(word)) return true; 
} 
return false; 

關於錯誤試圖給出一個答案。我會留下以前的答案的一部分,希望這會對某人有所幫助。

Object[] toArray()返回(從第一到最後一個元素)包含所有此列表中正確序列中的元素 的陣列。 返回的數組將是「安全的」,因爲沒有對此列表維護的引用是 。 (換句話說,這個方法必須分配一個 新陣列)。調用者可以自由修改返回的數組。

<T> T[] toArray(T[] a)以適當的順序(從第一個到最後一個元素)返回一個包含此列表中所有 元素的數組; 返回數組的運行時類型是指定數組的運行時類型。 如果列表適合指定的數組,它將返回其中。 否則,將使用指定數組的運行時類型和此列表的大小分配一個新數組。

+3

你可以添加一個解釋,這將如何幫助? –

+3

根據其[API文檔](https://docs.oracle.com/javase/8/docs/api/java/util/List.html#toArray-T:A-),列表'toArray(T [ ] a)'method「以適當的順序(從第一個元素到最後一個元素)返回一個包含此列表中所有元素的數組;返回數組的運行時類型是指定數組的運行時類型。 ,則返回其中,否則,將爲指定數組的運行時類型和此列表的大小分配一個新數組。這與您對該方法的描述不同。 –

+0

只是一瞬間,我正在糾正 – Andrew

4

下面的代碼工作完美:

public static void main(String s[]) 
{ 
    List<String> angry = new ArrayList<String>(); 
    angry.add("a"); 
    angry.add("b"); 
    angry.add("c"); 
    angry.add("mad"); 
    angry.add("b"); 
    angry.add("b"); 
    String word = "mad"; 
    Set<String> angryWordSet = new HashSet<String>(angry); 
    if (angryWordSet.contains(word)) 
    { 
     System.out.print("Yes"); 

    } 
    else 
    { 
     System.out.print("No"); 
    } 
} 

我假設當你做的readline,詞有「\ n」或「\ r」字符添加到它,這就是爲什麼它不匹配「單詞「varibale」。請確認,我沒有測試它:)

相關問題