我正在尝试创建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();
}
答案 0 :(得分:0)
Java Collection
中有很多要发现的内容。您使用了错误的数据结构,可以在List
中添加两个不同的对象,因为列表的目的是:
有序集合(也称为序列)。该接口的用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。
因此,您在添加对象时保留给定顺序中的元素,并且您可以按此顺序访问任何给定索引处的对象。
现在看来这不是你想要的,你宁愿没有重复的元素而不是订单,对吧?如果是这样,您需要使用实现Set接口的类,其目的是:
不包含重复元素的集合。更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)和至多一个null元素。正如其名称所暗示的,该界面对数学集抽象进行建模。
java框架包含一组的两个实现:
我建议您查看我给出的第一个链接,它是oracle教程,详细解释了Java Collections。
您的示例带有
使用ArrayList非常简单,而且距离不远。
将List
的声明更改为Set
(我使用TreeSet
但您可以使用Set
的任何其他实现):
Set<Line> lines = new TreeSet<Line>();
当您想要填充您的收藏并让它完成工作时,只需使用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。