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