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

Java 如何使用equals方法将对象添加到数组列表以排除类似对象?,java,object,arraylist,while-loop,equals,Java,Object,Arraylist,While Loop,Equals,我正在尝试创建线对象并将它们添加到数组列表中。我遇到的问题是排除任何彼此相似的行。我已经创建了一个equals方法来比较两条线,以确定它们是否相等。我在使用while循环时遇到问题。我没有错误消息。它编译得很好。它只是不会从文本文件中读取。我被困住了,不知道从这里还能去哪里 public void read( File fileName ) throws Exception { reader = new Scanner(fileName); //---------------

我正在尝试创建线对象并将它们添加到数组列表中。我遇到的问题是排除任何彼此相似的行。我已经创建了一个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();

}
public void read(文件名)引发异常
{
reader=新扫描仪(文件名);
//---------------------
//在开始循环之前必须读取第一个数字
int numLines=reader.nextInt();
行=新阵列列表(numLines);
//此循环为读取的文件中的每一行向lines数组添加一个新的Line对象。
while(reader.hasNext()){
对于(int i=0;i
这本书中有很多东西值得我们去发现。如果使用了错误的数据结构,则可以在
列表中添加两个不同的对象,因为该列表的目的是:

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

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

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

不包含重复元素的集合。更正式地说,集合不包含e1和e2元素对,因此e1.equals(e2)最多包含一个空元素。正如它的名字所暗示的,这个接口为数学集合抽象建模

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

  • :它是一个基于哈希的实现,享受哈希的好处,确保无论集合大小都有恒定的访问时间
  • :这是一个基于树的实现,基本操作有一个日志(n)时间
我建议您查看我提供的第一个链接,它是oracle教程,详细介绍了Java集合

你的例子与一套

这非常简单,而且离使用ArrayList不远

  • 列表
    的声明更改为类似的
    (我使用了
    树集
    ,但您可以使用
    的任何其他实现):

  • 如果您仍然想使用
    列表

    您可以使用该方法检查元素是否在
    列表
    (或任何其他
    集合
    )中


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

    您最好使用
    ,而不是
    列表
    。Set可能是正确的集合界面,但有两种以上的实现:@kiheru是的,您是对的,我想我指的是最明显的两个。我马上纠正。你能给我一个从哪里开始的提示吗?我只使用过数组和ArrayList。@KelliDavis您可以从阅读我在修改示例以使用集合时给您提供的javadoc链接开始。@KelliDavis看一看,告诉我您的想法,阅读集合教程,或者阅读一本关于java的好书,如果您还没有阅读过,请查看集合章节。
    Set<Line> lines = new TreeSet<Line>();
    
     Line l = new Line(beg.x, beg.y, end.x, end.y);
     lines.add(l);
    
      lines.contains(l)