如何使用equals方法将对象添加到数组列表以排除类似对象?

时间:2013-09-05 08:24:37

标签: java object arraylist while-loop equals

我正在尝试创建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();

}

1 个答案:

答案 0 :(得分:0)

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

  

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

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

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

  

不包含重复元素的集合。更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)和至多一个null元素。正如其名称所暗示的,该界面对数学集抽象进行建模。

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

  • HashSet:这是一个基于哈希的实现,享受哈希的好处,确保无论您的收藏大小如何,都可以获得持续的访问时间
  • TreeSet:这是一个基于树的实现,具有基本操作的log(n)时间。

我建议您查看我给出的第一个链接,它是oracle教程,详细解释了Java Collections。

您的示例带有

使用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);
    
  3. 如果您仍想使用List

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

      lines.contains(l)
    

    如果新收藏的Linel)包含在您的收藏中(lines),则会返回true。