【问题标题】:Search in Stack在堆栈中搜索
【发布时间】:2010-06-07 00:53:07
【问题描述】:

我创建了一个 Java 堆栈并添加了一些自定义对象。这些对象包含唯一 id 作为其字段之一。我需要根据唯一名称在堆栈中获取该对象的索引。请找到示例。

class TestVO{

 private String name;
 private String uniqueId;
//getters and setters
}
public class TestStack{
 public static void main(String args[]){
  TestVO vo1=new TestVO();
TestVO vo2=new TestVO();
TestVO vo3=new TestVO();

vo1.setName("Test Name 1")
vo1.setId("123")

vo2.setName("Test name 2");
vo2.setId("234");

Stack<TestVO> stack=new Stack<TestVO>();
stack.add(vo1);
stack.add(vo2);

//I need to get the index of a VO from stack using it's unique ID
}

}

有人可以帮我实现吗?

【问题讨论】:

  • 为什么需要使用堆栈?堆栈不适合这个。这是作业吗?
  • 我需要构建一个面包屑导航。我认为堆栈很方便。

标签: java stack


【解决方案1】:

首先,实现TestVO类的hashCode和equals方法:

class TestVO{

 private String name;
 private String uniqueId;

 public boolean hashCode() {
  if (uniqueId == null) return 0;
  return uniqueId.hashCode();
 }

 public boolean equals(Object o) {
  if (o instanceof TestVO) {
   TestVO other = (TestVO) o;
   return o.uniqueId.equals(uniqueId);
  }
  return false;
 }
//getters and setters
}

请注意,在 equals 方法中,您应该添加额外的代码来检查 o.uniqueId 是否为空。

现在您可以使用以下代码使用其 uniqueId 找到 TestVO 对象的索引:

int index = stack.indexOf(vo1);

【讨论】:

【解决方案2】:

您可以对Stack 使用search 方法。它将返回该对象与堆栈顶部的距离。希望这已经足够好了。您将需要定义 equals 方法 - 这应该很简单 - 只需对您的 id 字段进行比较即可。

Java API Documentation

【讨论】:

  • 非常感谢 Daniel。能否请您告诉我,是否为该 VO 覆盖 equals 方法是最好的方法?有什么方法可以在不修改 VO 代码的情况下实现这一点?
  • 我想如果你不能改变那个类,最好的选择是创建一个子类并覆盖 equals 方法。然后,当您推入堆栈时,您只需转换为新的子类(我认为这可行,最好自己尝试一下!)。或者只是在创建对象时使用新类。
  • @WPS: search() uses equals()`。 @Daniel:+1 考虑引用更新的链接。
【解决方案3】:

如果您打算将平等概念建立在 uniqueId 字段的基础上,那么您可能应该采取措施确保该字段已正确初始化,并且一旦初始化就不会更改。

如果您为该字段提供不受限制的 setter,那么如果在将 TestVO 对象插入到集合或映射中后,某些代码更改了该字段,您将得到各种破坏行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多