为了账号安全,请及时绑定邮箱和手机立即绑定

尝试比较对象不能使用 IF 语句 JAVA

尝试比较对象不能使用 IF 语句 JAVA

慕后森 2021-10-17 15:48:28
我正在编写一种在 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)) {
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

检查返回值是否为空。


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-10-17
?
慕斯709654

TA贡献1840条经验 获得超5个赞

您实际上是在此处实现空对象设计模式。您可以在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-10-17
?
MM们

TA贡献1886条经验 获得超2个赞

如果你的方法不返回一个布尔值而是一个特定的对象,你应该将它分配给一个变量来利用它。您不会实例化特定对象并将其返回以像布尔值一样对其进行测试。正因为如此,您必须重复方法调用以第二次检索结果,因为您需要在 std 输出中打印它。它是无奈和重复的代码/处理。


这应该是这样的:


Dodecahedron obj = myDList.findDodecahedron(label)

if(obj != null) {

    System.out.print(obj);

}

else {

    System.out.print("\t\"" + label + "\" not found");

}


查看完整回答
反对 回复 2021-10-17
  • 3 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信