1

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

}
4

1 回答 1

0

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

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

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

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

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

java 框架包含 set 的两个实现:

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

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

您的 Set 示例

这真的很容易,离使用 ArrayList 也不远了。

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

    Set<Line> lines = new TreeSet<Line>();
    
  2. 当您想要填充您的收藏并让它完成工作时,只需使用界面的add(E e)功能:Set

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

如果你仍然想使用List

您可以使用该方法检查元素是否在 a List(或任何其他相关的)中。Collectioncontains(Object o)

  lines.contains(l)

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

于 2013-09-05T08:38:40.433 回答