【问题标题】:How can I add objects to an array list using the equals method to exclude similar objects?如何使用 equals 方法将对象添加到数组列表以排除相似对象?
【发布时间】:2013-09-08 23:47:08
【问题描述】:

我正在尝试创建 Line 对象并将它们添加到数组列表中。我遇到的问题是排除任何彼此相似的行。我已经创建了一个比较两行以确定它们是否相等的 equals 方法。我在使用 while 循环时遇到问题。我没有错误消息。它编译得很好。它只是不会从文本文件中读取。我被困住了,不知道还能去哪里。

public void read( File fileName ) throws Exception
{
    reader = new Scanner(fileName);


    //---------------------
    //Have to read the first number before starting the loop
    int numLines = reader.nextInt();
    lines = new ArrayList <Line> (numLines);

    //This loop adds a new Line object to the lines array for every line in the file read.
    while( reader.hasNext() ) {
        for( int i = 0; i < numLines; i++ ) {
            int x = reader.nextInt();
            int y = reader.nextInt();
            Point beg = new Point(x,y);
            x = reader.nextInt();
            y = reader.nextInt();
            Point end = new Point(x,y);

            String color = reader.next();

              Line l =  new Line( beg, end, color );

              if (l.equals(lines.get(i)))
                  break;
              else
                  lines.add(i, l);


        }
    }

    //Print the action to the console
    System.out.println( "reading text file: " + fileName );
    reader.close();

}

【问题讨论】:

  • 您最好使用Set 而不是List

标签: java object arraylist while-loop equals


【解决方案1】:

Java Collection 有很多发现。您使用了错误的数据结构,您可以在 List 中添加两个不同的对象,因为列表的目的是:

有序集合(也称为序列)。此界面的用户可以精确控制每个元素在列表中的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并在列表中搜索元素。

因此,您可以在添加对象时保留给定顺序的元素,并且您可以按此顺序访问任何给定索引处的对象。

现在看来这不是您想要的,您宁愿没有重复的元素而不是订单,对吧?如果是这样,您需要使用一个实现 Set 接口的类,其目的是:

不包含重复元素的集合。更正式地说,集合不包含一对元素 e1 和 e2 使得 e1.equals(e2),并且最多包含一个空元素。正如其名称所暗示的那样,此接口对数学集抽象进行建模。

java 框架包含一个集合的两个实现:

  • HashSet :它是基于哈希的实现,无论您的集合大小如何,都可以享受哈希的好处,确保访问时间恒定
  • TreeSet :这是一个基于树的实现,基本操作需要 log(n) 时间。

我建议您查看我提供的第一个链接,它是详细解释 Java 集合的 oracle 教程。

您的 Set 示例

这真的很简单,而且与使用 ArrayList 相距不远。

  1. List 的声明更改为类似Set(我使用TreeSet,但您可以使用Set 的任何其他实现):

    Set<Line> lines = new TreeSet<Line>();
    
  2. 当您想要填充您的集合并让它完成工作时,只需使用Set 接口的add(E e) 函数即可:

     Line l = new Line(beg.x, beg.y, end.x, end.y);
     lines.add(l);
    

如果你还想使用List

您可以使用contains(Object o) 方法检查元素是否在List(或任何其他Collection)中。

  lines.contains(l)

如果新创建的 Line (l) 包含在您的集合 (lines) 中,这将返回 true。

【讨论】:

  • Set 可能是要使用的正确集合接口,但实现方式不止两种:docs.oracle.com/javase/7/docs/api/java/util/Set.html
  • @kiheru 是的,你是对的,我的意思是我猜最明显的两个。我马上更正了。
  • 你能告诉我从哪里开始吗?我只使用过数组和 ArrayLists。
  • @KelliDavis 好吧,您可以从阅读我给您的 javadoc 链接开始,同时我将您的示例修改为使用 Set。
  • @KelliDavis 看看并告诉我你的想法,阅读集合教程docs.oracle.com/javase/tutorial/collections/index.html 或阅读一本关于 java 的好书,如果你还没有这样做,请查看集合章节。
猜你喜欢
  • 2021-09-14
  • 2017-11-25
  • 1970-01-01
  • 2019-10-13
  • 2013-09-03
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多