пытаясь сравнить объект не может использовать оператор IF JAVA - PullRequest
0 голосов
/ 27 сентября 2018

Я пишу метод для поиска объекта в ArrayList.Если я смогу найти объект, я выведу его на экран, в противном случае я выведу сообщение об ошибке «Объект не найден».Проблема, с которой я сталкиваюсь, заключается в том, что мой метод - это объект «Додекаэдр», а не логическое значение. Я не могу использовать оператор if для сравнения, если объект существует в массиве.Как еще я могу подойти к этому?

Это код моего основного метода.

    System.out.print("\tLabel: ");
    label = userInput.nextLine();

    if(myDList.findDodecahedron(label)) {

        System.out.print(myDList.findDodecahedron(label));
    }
    else {
        System.out.print("\t\"" + label + "\" not found");
    }
        System.out.print("\n\nEnter Code [R, P, S, A, D, F, E, or Q]: ");
    break;

и это мой метод.

public Dodecahedron findDodecahedron(String label1In) {
      String label = "";
      String color = "";
      double edge = 0;
      Dodecahedron result = new Dodecahedron(label, color, edge);
      int index = -1;
      for (Dodecahedron d : dList) {
         if (d.getLabel().equalsIgnoreCase(label1In)) { 
            index = dList.indexOf(d);
            break;
         }    
      }
      if (index >= 0) {
         dList.get(index);
         result = dList.get(index);
      }
      return result;
   }

И это ошибка, которую я получаю, когда пытаюсь скомпилировать.

DodecahedronListAppMenu.java:99: error: incompatible types: Dodecahedron cannot be converted to boolean
               if(myDList.findDodecahedron(label)) {

Ответы [ 4 ]

0 голосов
/ 27 сентября 2018

Во-первых, не вызывайте метод find дважды.Присвойте результат локальной переменной для повторного использования.

Множественный выбор:

  1. Поскольку вы создаете объект dummy с пустой меткой, которая возвращаетсяесли не найден, вы можете проверить это.

    Dodecahedron result = myDList.findDodecahedron(label);
    if (result.getLabel().isEmpty()) {
        System.out.print("\t\"" + label + "\" not found");
    } else {
        System.out.print(result);
    }
    

    Альтернативой является шаблон проектирования нулевого объекта , описанный в ответе Mureinik .

  2. Изменить метод для возврата null для не найден.

    public Dodecahedron findDodecahedron(String label1In) {
        for (Dodecahedron d : dList) {
            if (d.getLabel().equalsIgnoreCase(label1In)) {
                return d;
            }
        }
        return null;
    }
    

    Использование:

    Dodecahedron result = myDList.findDodecahedron(label);
    if (result != null) {
        System.out.print(result);
    } else {
        System.out.print("\t\"" + label + "\" not found");
    }
    
  3. Изменить метод для возврата Optional(Java 8 +).

    public Optional<Dodecahedron> findDodecahedron(String label1In) {
        for (Dodecahedron d : dList) {
            if (d.getLabel().equalsIgnoreCase(label1In)) {
                return Optional.of(d);
            }
        }
        return Optional.empty();
    }
    

    Альтернативой для возврата Optional является использование потоков.

    public Optional<Dodecahedron> findDodecahedron(String label1In) {
        return dList.stream()
                    .filter(d -> d.getLabel().equalsIgnoreCase(label1In))
                    .findFirst();
    }
    

    Использование:

    Optional<Dodecahedron> result = myDList.findDodecahedron(label);
    if (result.isPresent()) {
        System.out.print(result.get());
    } else {
        System.out.print("\t\"" + label + "\" not found");
    }
    

Вариант 3 с использованием потоков является рекомендуемым решением.

0 голосов
/ 27 сентября 2018

Если ваш метод возвращает не логическое значение, а конкретный объект, вы должны назначить его в переменную, чтобы использовать его.Вы не создаете экземпляр конкретного объекта и не возвращаете его, чтобы проверить его как логическое значение.И из-за этого вы должны повторить вызов метода, чтобы во второй раз получить результат, поскольку вам нужно напечатать его в выводе std.Это беспомощный и дублирующий код / ​​обработка.

Это должно выглядеть так:

Dodecahedron obj = myDList.findDodecahedron(label)
if(obj != null) {
    System.out.print(obj);
}
else {
    System.out.print("\t\"" + label + "\" not found");
}
0 голосов
/ 27 сентября 2018

Вы по существу реализуете шаблон проектирования пустых объектов здесь.Вы можете сделать это явным образом в методе findDodecahedron (примечание - я заменил реализацию на потоки в стиле Java 8 для элегантности, но на самом деле это не требуется):

public static final Dodecahedron NULL_DODECAHEDRON = new Dodecahedron("", "", 0);
public Dodecahedron findDodecahedron(String label1In) {
      return dList.stream()
                  .filter(d -> d.getLabel().equalsIgnoreCase(label1In))
                  .findFirst()
                  .orElse(NULL_DODECAHEDRON);
}

И затем используйте его весли условие:

if (!myDList.findDodecahedron(label).equals(NULL_DODECAHEDRON)) {
    System.out.print(myDList.findDodecahedron(label));
} else {
    System.out.print("\t\"" + label + "\" not found");
}
0 голосов
/ 27 сентября 2018

Проверьте, является ли возвращаемое значение нулевым.

if (myDList.findDodecahedron(label) != null)

Вам потребуется обновить findDodecahedron(), чтобы оно возвращало нулевое значение, если оно ничего не находит, а не новый объект.Изменение начального значения result сделает это:

Dodecahedron result = null;

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

public Dodecahedron findDodecahedron(String label1In) {
   for (Dodecahedron d : dList) {
      if (d.getLabel().equalsIgnoreCase(label1In)) { 
         return d;
      }    
   }
   return null;
}

Вы также можете оптимизировать его с помощью потоков Java 8:

public Dodecahedron findDodecahedron(String label1In) {
   return dList.stream()
      .filter(d -> d.getLabel().equalsIgnoreCase(label1In))
      .findAny()
      .orElse(null);
}
...