Возврат логического результата при поиске связанного списка для существующего члена - java

Я пишу программу для класса, которая вводит пользователя в бесконечный цикл и принимает три разные команды (добавить x, удалить x, существует x) + целочисленное значение. Когда пользователь вводит «exists x», программа должна вернуть логический результат, указывающий, существует ли значение в списке.

Методы добавления x и удаления x работают нормально, но при поиске в списке я не могу получить результат "истина/ложь". Я пробовал это несколькими разными способами, вот где я сейчас нахожусь с помощью метода exists x:

public class LinkedNode {
public int x;         // The data value

public LinkedNode next;  // Reference to the next LinkedNode

// Default constructor
LinkedNode() {
    next = null;
}

// Constructor that initializes the data values
LinkedNode(int x) {
    this.x = x;
}

public void display() {
    System.out.print(x + " ");
}

}


public class Set {

public LinkedNode firstLink;

Set(){
    firstLink = null;
}

public boolean isEmpty() {
    return (firstLink == null); //nothing in Set yet
}

public void add(int x) {
    LinkedNode newLink = new LinkedNode(x);

    newLink.next = firstLink;
    firstLink = newLink;
}

public boolean exists(int x) {

   LinkedNode theLink = firstLink;

   while (theLink.x != x) { // keep searching until match
       if (theLink.next == null) // we've hit the end without a match, return false
               return false;
           else
               theLink = theLink.next;
       }
       return true;
}

public LinkedNode delete(int x) {
    LinkedNode currentLink = firstLink;
    LinkedNode previousLink = firstLink;

    while (currentLink.x != x) { // search while no match is found
        if (currentLink.next == null) {
            return null; // not found
    }   else { // moves to next LinkedNode
        previousLink = currentLink;
        currentLink = currentLink.next;
        }
    }
    if (currentLink == firstLink) { // first link matches search
        firstLink = firstLink.next; // delete link
    }
    else { // any other link is a match except firstLink
        previousLink.next = currentLink.next;
    }
    return currentLink;
}

public String toString() {
    String str = "";

    LinkedNode cur = firstLink;
    while (cur!=null) {
        str += cur.x + " ";
        cur = cur.next;
    }
    return str;
}

}

Вот мой тест/драйвер:

import java.util.*;

public class Test {

public static void main(String[] args) {
    Set dataSet = new Set();
    Scanner input = new Scanner(System.in);


        while (1<2) { // infinite loop on purpose

        String command, value;
        System.out.print("Enter command: ");
        String line = input.nextLine();
        String [] userInput = line.split(" ");
        command = userInput [0];
        value = userInput [1];

        if (!command.equalsIgnoreCase("add") && !command.equalsIgnoreCase("del") && !command.equalsIgnoreCase("exists")){
            System.out.println("Invalid command.");
            System.out.println("Valid commands are: add x, del x & exists x");
            System.out.print("Enter command: ");
        }
        else if (command.equalsIgnoreCase("add")) {
            dataSet.add(Integer.parseInt(value));
            System.out.println(dataSet);
        }
        else if (command.equalsIgnoreCase("del")){
            dataSet.delete(Integer.parseInt(value));
            System.out.println(dataSet);
        }
        else if (command.equalsIgnoreCase("exists"));{
            dataSet.exists(Integer.parseInt(value));
            System.out.println(dataSet);

        }
    }

Я хочу, чтобы программа отображала "истина/ложь", если искомое значение существует в ссылке, аналогично тому, как она отображает текущий список после добавления/удаления. Любые подсказки относительно того, где я ошибаюсь?

Enter command: add 3
3 
Enter command: add 1
1 3 
Enter command: add 20
20 1 3 
Enter command: exists 20
Enter command: 

person jojoj222    schedule 16.12.2017    source источник
comment
Мы можем увидеть весь ваш класс?   -  person Luke Garrigan    schedule 16.12.2017
comment
отредактировано, чтобы включить все, что я написал для него.   -  person jojoj222    schedule 16.12.2017
comment
И ваш класс LinkedNode   -  person Luke Garrigan    schedule 16.12.2017
comment
Извините - думал, что это отключило меня, теперь все включено   -  person jojoj222    schedule 16.12.2017
comment
Удалите ; в этой строке: else if (command.equalsIgnoreCase("exists"));{ --- Кроме того, если вы хотите, чтобы программа отображала значение true/false, возможно, вам следует напечатать возвращаемое значение< /b> из dataSet.exists() вызова.   -  person Andreas    schedule 16.12.2017


Ответы (4)


Вы действительно близки, ваш код на самом деле работает нормально, просто у вас есть небольшая опечатка, которая его сбивает!

else if (command.equalsIgnoreCase("exists"));{

Этот код содержит точку с запятой в конце, это, к сожалению, действительная Java и поэтому не вызывает никаких исключений во время компиляции. Часто, хотя вы должны получить предупреждение о том, что:

Оператор цитаты 'if' имеет пустое тело

Кроме того, поскольку это выполняет каждый цикл, ваши результаты отображаются дважды, поэтому удаление точки с запятой должно помочь:

else if (command.equalsIgnoreCase("exists")) {
    System.out.println(dataSet.exists(Integer.parseInt(value)));
    System.out.println(dataSet);
}

В примере кода я печатаю результат того, существует ли значение в LinkedList просто для ясности.

Примечание. Также может быть целесообразно добавлять новую строку каждый раз, когда вы просите пользователя ввести команду, чтобы можно было разделить разные команды:

System.out.print("\nEnter command: ");

Еще раз, это чисто косметический, просто делает ваш вывод более читабельным!

person Luke Garrigan    schedule 16.12.2017

Спасибо за помощь, Andreas & M H - ниже показано, что дало ожидаемый результат:

else if (command.equalsIgnoreCase("exists")){
    if(dataSet.exists(Integer.parseInt(value)))
    {
      System.out.println("true");
    }
    else
    {
       System.out.println("false");
    }

}
person jojoj222    schedule 16.12.2017

Прежде всего, вы должны напечатать желаемое значение, это поможет вам проверить, работает ли метод.

else if(command.equalsIgnoreCase("exists"){
   if(dataSet.exists(Integer.parseInt(value)))
     System.out.println("true");
   else
      System.out.println("false");`enter code here`

Вы также должны компрометировать, если список (Set) пуст, возможно, код не работает из-за этого. Также было бы правильнее, если бы вы использовали локальные переменные как приватные. Измените их и напишите для них методы setX(x), getX(). О методе существует, я думаю, что лучшим кодом был бы этот:

public Boolean exists(int x){
    LinkedNode theLink = firstLink;
    Boolean resul = false;
    while(!isEmpty() && theLink.getNext() != null){
         if(link.getX() != x)
            theLink = theLink.getNext(); 
         else
            resul = true;
    }
    return resul; 

Если вы не хотите устанавливать локальные переменные linkedNode как приватные, просто измените getNext и getX на .next и .x. Попытайтесь понять код и в следующий раз постарайтесь больше времени самостоятельно, это единственный способ научиться.

person NoobyProgrammer    schedule 16.12.2017

Ваша функция, вероятно, возвращает правильное логическое значение. Но вы не печатаете результат. Вы можете использовать следующий тип кода.

if(dataSet.exists(Integer.parseInt(value))==True)
{
     system.out.println("exists");
}
else
{
     system.out.println("not exists");
}

Приведенный выше код является просто псевдокодом.

person Md Monjur Ul Hasan    schedule 16.12.2017
comment
exists() возвращает boolean, поэтому exists(...) == value никогда не скомпилируется. - person Andreas; 16.12.2017
comment
Не знаю, почему за вас проголосовали, я использовал этот псевдокод, и программа работает нормально. Спасибо вам за помощь! - person jojoj222; 16.12.2017
comment
Значение означает True или False ее. - person Md Monjur Ul Hasan; 16.12.2017
comment
Если это работает для вас, пожалуйста, проголосуйте и примите ответ. - person Md Monjur Ul Hasan; 16.12.2017
comment
Как value могло означать True или False, когда value является String, переданным в метод parseInt()? --- Кроме того, True — неизвестная переменная. Это, конечно, не ключевое слово. Кроме того, if (exists() == true) избыточно и должно быть просто if (exists()). - person Andreas; 16.12.2017
comment
Вы не редактировали ответ с момента моего последнего комментария, - person Andreas; 16.12.2017