【问题标题】:Adding unique object instances into an ArrayList将唯一对象实例添加到 ArrayList
【发布时间】:2012-03-16 11:01:24
【问题描述】:

我遇到了非常基本的 OO 理解问题,非常感谢任何帮助。

每次按下按钮时,我都会尝试将“Thing”的实例添加到数组列表中,但我不知道如何创建唯一实例以添加到列表中。按下不同的按钮应该会从列表中删除最近的对象。

ArrayList myList = new ArrayList<Thing>();
if(input.isKeyPressed(Input.KEY_A)){
            Thing myThing = new Thing();
            myThing.setNumber(myList.size());
            myList.add(myThing);
        }

if(input.isKeyPressed(Input.KEY_R)){
            if(myList.size()>0){
                myList.remove(myList.size()-1);
            }
        }

如果我打算制作很多“事物”,但我并不关心它们的名称(我也不想跟踪唯一的事物对象名称)。如何以最小的痛苦在每次按下按钮时创建一个独特的“事物”对象。

更新: 感谢cmets,请让我尝试更好地表达我的问题... 当我创建一个充满“事物”的 ArrayList 时,每个实例都称为“myThing”,每个实例都具有相同的实例变量值。

如果我想让一些“事物”拥有boolean isVisable = true,而其他的拥有boolean isVisable = false。我被卡住了,因为列表的每个元素都具有相同的名称。

【问题讨论】:

  • 以上代码有什么问题?
  • 我也不明白。你的问题到底是什么?如果您希望它独一无二,那么也许可以尝试哈希方法?这是你想要的吗?我不确定,抱歉。
  • 每次执行new Thing() 时,您都会创建一个唯一的Thing 实例。您需要稍微澄清一下您的问题,以说明您的问题是什么。
  • 看起来您想使用 Stack 而不是 ArrayList。
  • 我将不得不研究“哈希”和“堆栈”,我对 Java 非常陌生。 Emil,当你说我每次实例化new Thing() 时都会创建一个唯一的Thing 实例,即使它总是具有相同的名称,它真的是一个唯一的实例吗? myThing?

标签: java oop arraylist


【解决方案1】:

确保 Thing 正确实现 equals 和 hashCode,然后将实例存储在 Set 集合(即 HashSet)中。随着 hashCode() 和 equals() 的实现,哪两个 Thing 实例是相同的完全取决于您,因此您将能够以任何您需要的方式强制执行唯一性。

现在这里的诀窍是实现 hashCode() 和 equals() 并不是一件容易的事,但是如果你打算使用 Java,你需要知道如何去做。所以请阅读 Effective JAva 的appropriate chapter(或者最好阅读整本书)。

【讨论】:

  • 感谢您的回答和链接,虽然我已经阅读并理解了“Head First Java”,但我的理解肯定少于全部。是时候多学习了。
  • 好吧,如果此时您的所有 Java 经验都是“Head First Java”,那么“Effective Java”可能还为时过早。这是一篇非常严肃的文章,需要您了解有关该语言的许多核心细节。
  • 你能推荐跟进'head first java'吗?再次感谢。
  • 对不起,不知道。是时候编写和阅读一些代码了。
【解决方案2】:

试试这个:

$ cat Thing.java
import java.util.*;
public class Thing{
        UUID id;
        Thing () {
                id = UUID.randomUUID();

        }

        public String toString(){
                return id.toString();

        }

        public static void main(String[] argv) {
                Thing t = new Thing();

                System.out.println(t);
        }
}


$ javac Thing.java  && java Thing 
08bb3702-84d3-4bc3-b8ab-bb52b90b8f78

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 2013-11-12
    • 1970-01-01
    • 2011-12-24
    • 2016-09-26
    相关资源
    最近更新 更多