2011-10-27 100 views
0

我想問一個列表是否包含某個字符串。Java無法找到鏈接列表的符號

public void searchList(Scanner scan, Object list){ 


    System.out.println("Search for element:\t"); 
    String p = scan.nextLine(); 

    if (list.contains(p)) 
     System.out.println(p + " is in the list"); 
    else 
     System.out.println(p + " is not in the list."); 
} 

我越來越:

Prog7Methods.java:23: cannot find symbol 
symbol : method contains(java.lang.String) 
location: class java.lang.Object 
     if (list.contains(p)) 

我不明白!我已經導入了java.io. *和java.util。*它怎麼不能識別這個?

+0

我現在正在嘗試從pm.searchList(scan,list)調用其他類的搜索列表;我得到這個:Prog7Methods中的MyProgram7.java:53:searchList(java.util.Scanner,java.util.List)不能應用於(java.util.Scanner,MyList )情況3: pm.searchList(掃描,列表); – Josh

+0

嗨喬希。 MyList是否實現了List接口?查看下面的答案,瞭解關於方法和接口等的一些指導。 –

回答

1

您需要將列表聲明爲列表。取而代之的

public void searchList(Scanner scan, Object list){ 

使用

public void searchList(Scanner scan, List list){ 

甚至更​​好:編譯

public void searchList(Scanner scan, List<String> list){ 
+0

我現在遇到錯誤,當我嘗試調用pm.searchList(掃描,列表)從另一個類。 – Josh

0

listObject而不是List。如果您認爲這是一個LinkedList然後更改方法簽名。如果沒有,做一個演員,但是做一個instanceof

1

因爲沒有Object.contains()方法。你的方法簽名可能應該是(Scanner, List)(Scanner, Object)

1

listObjectObject沒有contains方法。您需要首先將其投射到List以調用contains方法。或者,您可以更改方法簽名以接收List

+0

我該怎麼做 – Josh

+0

你可以這樣做'List linkedList =(LinkedList)list;'和calls包含'linkedList'對象的方法。但更好的做法是更改方法簽名以強制傳入對象成爲'List '。如果傳入對象不是'List'類型,則投射會導致運行時異常。 –

+0

我現在在嘗試撥打電話時出現錯誤,請參閱上文 – Josh

0

錯誤輸出是相當清楚的。您的列表變量不是列表類型,而是對象。對象沒有方法「包含」。 更改

Object list 

List<String> list 

或(Java 1.4中及以上)

List list 
1

花點時間來研究Object。所有Java類都是Object的子類,所以所有的Java類都繼承了clone(),equals(),finalize(),hashCode()等方法。

contains()不在Object方法的列表中。 contains()來自不同的地方 - 一個名爲Collection的接口。一個接口爲某個類定義了一個契約(並且所有類最終都是對象),該契約是必須實現的方法列表。 Collection定義了一個contains()方法,並且實現了Collection接口的所有東西,包括任何實現類,都必須提供一個contains()方法。

當您向searchList()方法提供列表時,您將通過Object參數傳遞它。這意味着在searchList()中,即使您在調用searchList()的列表真的是某種列表時,唯一可以調用的方法也是爲Object定義的方法。從某種意義上說,您的參數列表已「清除」了列表參數的列表內容。

你應該做的,正如已經提到的那樣,將你的參數改爲Collection或者List。這樣,在你的searchList()方法中,Java編譯器知道「list」參數實際上是一個List,所以真的有一個contains()方法。

請注意,List也是一個接口,它通過擴展它來合併Collection接口。因此,實現List接口的每個類都必須提供Collection中的方法以及其他List方法。你應該使用List還是Collection?我的意見是使用最少的約束選擇。看起來你的searchList()只使用contains(),所以實際上,它可以在任何實現了Collection的東西上工作,例如,包括Set

因此,我會將您的方法從引用到您正在查找的內容(列表內)改爲您正在查找的內容(下一行)。

public void searchForNextLine(Scanner scan, Collection lines){ 


    System.out.println("Search for element:\t"); 
    String p = scan.nextLine(); 

    if (lines.contains(p)) 
     System.out.println(p + " is in the collection of lines"); 
    else 
     System.out.println(p + " is not in the collection of lines."); 
} 

現在讓我們假設你有ArrayList實現您的清單。之後你改變主意,決定TreeSet更好。這個searchForNextLine()方法將繼續工作,因爲TreeSet和ArrayList都是Collection的實現。更好的是,如果你決定推出你自己的列表類(並且確定你想要一個實際的列表,而不是其他類型的集合),那麼只要你實現List接口,你將被迫提供一個contains()方法(因爲你還將實現Collection接口作爲實現List接口的一部分),並且你可以將新類的對象傳遞給searchForNextLine(),相信它能夠完全正常工作而不會有任何改變。

public class MyListClass<T> implements List<T> { 
    // all the methods required to implement a List interface 
}