这似乎是一个愚蠢的问题,但我已经坚持了一段时间。我的代码应该检查两个数组列表是否相等,即使它们是乱序的。 boolean equals(Object other)如果给定对象是包含与lineSegments相同的线段的LineSegmentDB,则返回true。到目前为止,我有这段代码:
public boolean equals(Object other)
{
// Object lineSegments2 = new ArrayList<Object>();
// lineSegments2 = other;
if (!(other instanceof LineSegmentDB)) {
return false;
}
ArrayList otherTest = (ArrayList) other;
if(other.size() != lineSegments.size()){
return false;
}
for(int i = 0; i < lineSegments.size(); i++){
if(!(other.contains(lineSegments.get(i)))){
return false;
}
}
return true;
//return lineSegments2;
}
我确保其他是LineSegmentDB的实例。然后我很确定我必须为其他人创建一个实例变量,所以我可以使用other.size()或other.get(i)之类的东西。我认为代码与我写的其他代码类似,但是无论我尝试什么都不起作用,有什么建议吗?
其他代码:
ArrayList<LineSegment> union(LineSegmentDB other){
ArrayList<LineSegment> lineSegments2 = new ArrayList<LineSegment>();
lineSegments2 = other.lineSegments;
for(int i = 0; i < other.size(); i++){
if(hasPoint(other.getSegment(i))){
System.out.println("Has Duplicate");
}else{
lineSegments.add(other.getSegment(i));
}
}
return lineSegments;
}
感谢您的帮助!
编辑,不确定这是否有帮助:
public class LineSegmentDB {
public ArrayList<LineSegment> lineSegments = new ArrayList<LineSegment>();
LineSegmentDB(){
}
public static void main(String[] args) {
LineSegmentDB db = new LineSegmentDB();
LineSegmentDB db2 = new LineSegmentDB();
db.addLineSegment(new LineSegment(2,2,4,2));
db.addLineSegment(new LineSegment(3,3,1,3));
db.addLineSegment(new LineSegment(4,2,4,10));
db2.addLineSegment(new LineSegment(4,2,2,2));
db2.addLineSegment(new LineSegment(4,2,4,10));
db2.addLineSegment(new LineSegment(3,3,3,1));
System.out.println(db.equals(db2));
}
此外,我知道它可以粘贴很多代码,但也许它可能会回答一些我无法解决的问题。 http://pastebin.com/FUEsYA0n
再次感谢,你们是严肃的生活储蓄者。
答案 0 :(得分:0)
什么是LineSegmentDB
?它是否扩展了一些List
实现或实现List
接口本身?我猜答案是没有。
现在使用equals()
方法:
if (!(other instanceof LineSegmentDB)) {
return false;
}
这部分没问题。如果给定对象与实例的类型相同,则首先正确检查。
ArrayList otherTest = (ArrayList) other;
if(other.size() != lineSegments.size()){
return false;
}
我猜你的LineSegmentDB
根本不是List
。您的类必须实现List
接口。这可以通过两种方式完成:
implements List
extends ArrayList
如果上面的其中一个项目符号为true,您可以安全地将对象转换为List
,然后使用size()
或contains()
方法。
希望这有用:)
答案 1 :(得分:0)
这更像猜测而不是答案,但是......
在您的第一段代码中,您检查other
是LineSegmentDb
类型,如果它是真的,您将other
投射到ArrayList
类型。您收到java.lang.ClassCastException
,因为其他类型LineSegmentDb
正如您选中的那样。
在第二段代码中,other.lineSegments
让我猜测LineSegmentDb
对象具有List<LineSegment>
属性。如果是这样,请尝试更改
if(other.lineSegments.size() != lineSegments.size()){
return false;
}
for(int i = 0; i < lineSegments.size(); i++){
if(!(other.contains(lineSegments.get(i)))){
return false;
}
}
到
if(((LineSegmentDB)other).lineSegments.size() != lineSegments.size()) {
return false;
}
for(int i = 0; i < lineSegments.size(); i++){
if(!(((LineSegmentDB)other).lineSegments
.contains(lineSegments.get(i)))){
return false;
}
}
希望它有所帮助。
答案 2 :(得分:0)
如果不使用任何其他数据结构,则使用列表检查集合相等可能效率低下。
如果您有2个列表,listA
和listB
,检查它们是否具有相同元素的直观方法是迭代listB
中每个元素的未标记项目listA
。如果它们具有相同的长度n
,则它是二次时间复杂度。
相反,您可以在Java中使用HashMap
。这是您的任务的快速伪代码:
// do proper null and size equality checks
Map<V, Integer> map = new HashMap<V, Integer>();
for (V v : listA) {
int countSoFar = map.getOrDefault(v, 0);
map.put(v, countSoFar + 1);
}
for (V v : listB) {
int countSoFar = map.getOrDefault(v, 0);
if (countSoFar == 0) {
return false;
}
map.put(v, countSoFar - 1);
}
return checkIfAllValuesInMapEqualZero(map);
这基本上是做什么的?它通过增加每个元素的计数器来记录第一个列表中每个元素的出现次数。然后,它会减少第二个列表中每个元素的计数器。
如果listB
中有1个类型的元素多于listA
中的元素,则在listB
中使用所有元素之前,该特定元素的计数器将达到0,这表示listA
中缺少某些内容,表示它们不相同
以类似的方式,listA
可能包含的元素多于listB
。如果是这种情况,则在地图中的一个条目将具有&gt; 0.
答案 3 :(得分:0)
instanceof
延长LineSegmentDB
时,您的ArrayList
测试才有效。 (或者您必须更正instanceof
测试)contains
方法使用equals
LineSegment
的实现来比较两个实例是否是功能等效的。如果您未覆盖equals
,则contains
检查将仅比较参考。