#java #list
#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. * как он не распознает это?
Комментарии:
1. Сейчас я пытаюсь вызвать список поиска из другого класса с помощью pm.searchList(сканирование, список); Я получаю следующее: MyProgram7.java:53: searchList(java.util. Сканер, java.util.List) в prog7методы не могут быть применены к (java.util. Сканер, myList<java.lang. Строка>) случай 3: pm.searchList(сканирование, список);
2. Привет, Джош. Реализует ли myList интерфейс списка? Ознакомьтесь с моим ответом ниже для получения некоторых указаний по методам, интерфейсам и тому подобному.
Ответ №1:
Вам нужно объявить список как список. Вместо
public void searchList(Scanner scan, Object list){
используйте
public void searchList(Scanner scan, List list){
или даже лучше:
public void searchList(Scanner scan, List<String> list){
Комментарии:
1. Теперь я получаю сообщение об ошибке при попытке вызвать pm.searchList(сканирование, список) из другого класса.
Ответ №2:
Потому что нет Object.contains()
метода. Ваша сигнатура метода, вероятно, должна быть (Scanner, List)
not (Scanner, Object)
Ответ №3:
list
является a Object
и Object
не имеет contains
метода. Вам нужно привести его к List
contains
методу первого вызова. Или вы можете изменить сигнатуру метода, чтобы получить List
.
Комментарии:
1. Вы можете сделать это
List linkedList = (LinkedList) list;
и вызвать метод contains дляlinkedList
объекта. Но лучше изменить сигнатуру метода, чтобы заставить входящий объект быть aList<String>
. Приведение может вызвать исключения во время выполнения, если входящий объект не являетсяList
типом.2. Теперь я получаю сообщение об ошибке при попытке вызова, см. Выше
3. @Josh Как вы объявили
List
в своем вызывающем классе / методе. Он должен бытьList<String> list = new LinkedList<String>
в классе вызывающего.4. myList<String> list = new MyArrayList<String>(); Это в классе, из которого я пытаюсь вызвать
5. @Josh Что такое
MyList
иMyArrayList
. Похоже, они не имеют типаList
. Объявите его следующим образом в классе вызывающегоList<String> list = new LinkedList<String>()
и добавьте строки к этому объекту списка, а затем вызовитеpm.searchList(scan, list)
. Пожалуйста, найдите время, чтобы прочитать хороший учебникCollections
, подобный этому java.sun.com/developer/onlineTraining/collections /…
Ответ №4:
Найдите минутку, чтобы изучить объект. Все классы Java являются подклассом Object , и поэтому все классы Java наследуют методы clone(), equals(), finalize(), hashCode() и так далее.
contains() отсутствует в этом списке методов объекта. contains() поступает из другого места — интерфейса, называемого Collection . Интерфейс определяет контракт для некоторого класса (и все классы в конечном счете являются объектами), этот контракт представляет собой список методов, которые должны быть реализованы. Коллекция определяет метод contains() , и все, что реализует интерфейс коллекции, включая любой класс, реализующий список, должно предоставлять метод contains() .
Когда вы предоставляете список своему методу searchList(), вы передаете его через параметр объекта. Это означает, что в searchList() единственными методами, которые могут быть вызваны, являются методы, определенные для Object , даже если список в вашем вызове searchList() действительно является каким-то списком. В некотором смысле, ваш список параметров «вычищен» из списка параметров списка.
Как уже упоминалось, вам следует изменить свой параметр на Collection или List . Таким образом, в вашем методе searchList() компилятор Java знает, что параметр «list» на самом деле является списком, и поэтому действительно имеет метод contains() .
Обратите внимание, что список также является интерфейсом, и он включает в себя интерфейс коллекции, расширяя его. Поэтому каждый класс, который реализует интерфейс списка, должен предоставлять методы в коллекции, а также дополнительные методы списка. Следует ли использовать список или коллекцию? Мое мнение заключается в том, чтобы использовать наименее стеснительный выбор. Похоже, что ваш 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 . Позже вы передумаете, решив, что набор деревьев лучше. Этот метод searchForNextLine() будет продолжать работать, поскольку как TreeSet, так и ArrayList являются реализациями Collection. А еще лучше, если вы решите создать свой собственный класс list (и уверены, что вам нужен реальный список, а не какой-либо другой вид коллекции), тогда, пока вы реализуете интерфейс List , вы будете вынуждены предоставить метод contains() (потому что вы также будете реализовывать интерфейс коллекции как часть реализации интерфейса списка), и вы можете передать объект вашего нового класса в searchForNextLine(), уверенный, что он будет работать отлично без каких-либо изменений вообще.
public class MyListClass<T> implements List<T> {
// all the methods required to implement a List interface
}
Ответ №5:
list
это Object
не a List
. Если вы считаете, что это a LinkedList
, измените сигнатуру метода. Если нет, выполните приведение, но выполните instanceof
.
Ответ №6:
Вывод ошибки компилятора вполне понятен. Ваша переменная list — это не тип списка, а объект. У объекта нет метода «contains». Изменить
Object list
Для
List<String> list
или (Java 1.4 и старше)
List list