попытка сравнения объекта не может использовать оператор IF JAVA

63
6

Я пишу метод для поиска объекта в ArrayList. Если я смогу найти объект, я распечатаю его на экране, иначе я напечатаю сообщение об ошибке "Объект не найден". Проблема, с которой я сталкиваюсь, заключается в том, что мой метод является объектом "Dodecahedron", а не логическим, я не могу использовать оператор 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)) {

спросил(а) 2021-01-25T14:34:45+03:00 4 месяца, 2 недели назад
1
Решение
63

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

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

Вам нужно будет обновить findDodecahedron() чтобы вернуть значение null, если оно ничего не находит, а не новый объект. Изменение начального значения 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);
}

ответил(а) 2021-01-25T14:34:45+03:00 4 месяца, 2 недели назад
45

Вы в основном реализуете шаблон проектирования нулевого объекта. Вы можете сделать это явным в методе 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:

if (!myDList.findDodecahedron(label).equals(NULL_DODECAHEDRON)) {
System.out.print(myDList.findDodecahedron(label));
} else {
System.out.print("\t\"" + label + "\" not found");
}

ответил(а) 2021-01-25T14:34:45+03:00 4 месяца, 2 недели назад
45

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

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

Dodecahedron obj = myDList.findDodecahedron(label)
if(obj != null) {
System.out.print(obj);
}
else {
System.out.print("\t\"" + label + "\" not found");
}

ответил(а) 2021-01-25T14:34:45+03:00 4 месяца, 2 недели назад
45

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

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


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

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

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

Измените метод, чтобы вернуть значение null для not found.

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");
}

Изменить метод для возврата 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 с использованием потоков.

ответил(а) 2021-01-25T14:34:45+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема