Java не удается найти символ со связанным списком

#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 объекта. Но лучше изменить сигнатуру метода, чтобы заставить входящий объект быть a List<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