我正在尝试删除两个数组列表中的所有重复点。每个列表都是通过查找指向哪个国家/地区的国家/地区链接创建的,如果它们链接,则会同时在两个阵列中创建新点。
我的想法是,我可以循环两个数组的大小(或大小为1)并在点之间绘制线条。
目前的问题是它没有删除这些点,也没有将它们全部删除。
我有以下数组
//Different values of course.
Array1 = [Point[1,5]],[Point[1,5]],[Point[1,5]][Point[1,5]]
Array2 = [Point[1,5]],[Point[1,5]],[Point[1,5]][Point[1,5]]
以下是删除重复数组的代码:
private ArrayList<ArrayList<Point>> checkDuplicatePoints(ArrayList<Point> Array1, ArrayList<Point> Array2)
{
for(int index1 = 0; index1 < Array1.size(); index1++)
{
for(int index2 = 0; index2 < Array2.size(); index2++)
{
//So not the same position in the list.
if(index1 != index2)
{
if(
Array1.get(index1).x == Array2.get(index2).x &&
Array1.get(index1).y == Array2.get(index2).y
)
{
Array1.remove(index1);
Array2.remove(index2);
checkDuplicatePoints(Array1, Array2);
}
}
}
}
ArrayList<ArrayList<Point>> n2DPointArray = new ArrayList<ArrayList<Point>>();
n2DPointArray.add(Array1);
n2DPointArray.add(Array2);
return n2DPointArray;
}
答案 0 :(得分:2)
就我而言,问题可能是您应该查看这些代码和示例
public class test {
public static void main(String ap[])
{
List<Point> mList1 =new ArrayList<Point>();
List<Point> mList2 =new ArrayList<Point>();
Point mPoint1 = new Point(1, 2);
Point mPoint2 = new Point(2, 3);
for (int i=0;i<3;i++){
mList1.add(mPoint1);
mList1.add(mPoint2);
}
Point mPoint3 = new Point(1, 2);
Point mPoint4 = new Point(3, 4);
for (int i=0;i<2;i++){
mList2.add(mPoint3);
mList2.add(mPoint4);
}
System.out.println(mList1);
//System.out.println(mList2);
new test().removingDuplicatesQID(mList1, mList2);
System.out.println(mList1);
}
public void removingDuplicatesQID(List<Point> list1,List <Point> list2)
{
Set<Point> uniqueEntries = new HashSet<Point>();
for (Iterator iter = list1.iterator(); iter.hasNext();)
{
Point element = (Point) iter.next();
if (!uniqueEntries.add(element))
/* if current element is a duplicate, remove it */
iter.remove();
}
uniqueEntries.clear();
}
}
输出
System.out.println(mList1);
[java.awt.Point [x = 1,y = 2],java.awt.Point [x = 2,y = 3],java.awt.Point [x = 1,y = 2],java .awt.Point [x = 2,y = 3],java.awt.Point [x = 1,y = 2],java.awt.Point [x = 2,y = 3]]
//从arrayList1中删除副本
System.out.println(mList1);
[java.awt.Point [x = 1,y = 2],java.awt.Point [x = 2,y = 3]]
我希望这可以帮助您或者..更具体地解决您的问题,并从阵列列表中获得结果
答案 1 :(得分:0)
将它们放入Set。集合不允许重复条目。
编辑: 另一种可能性:首先不要添加它们。
void addPoint( Point newPoint )
{
if( !array1.contains(newPoint) )
{
array1.add(newPoint);
}
}
另一个编辑:
现在,它更清楚:为什么不为此创建自己的数据结构。我们称之为CountryLink
。
它将有两个Point
和覆盖equals()
,因为它返回true,如果它的两个实例具有相同的两个点,无论是作为开始还是结束。然后你可以很容易地把它放到如上所示的ArrayList中。或者进入一个自动拒绝重复的Set。
答案 2 :(得分:0)
我不确定,如果我理解你的问题是正确的,但这里是一个制作清单的解决方案,它只包含不同的元素(它不是非常有效):
private ArrayList<Point> distinctPoints(ArrayList<Point> first, ArrayList<Point> second)
{
ArrayList<Point> distinct = new ArrayList<Point>();
for(Point point : first)
if(!distinct.contains(point))
distinct.add(point);
for(Point point : second)
if(!distinct.contains(point))
distinct.add(point);
return distinct;
}
另一个用于查找副本:
private ArrayList<Point> duplicatePoints(ArrayList<Point> first, ArrayList<Point> second)
{
ArrayList<Point> duplicate = new ArrayList<Point>();
ArrayList<Point> distinct = new ArrayList<Point>();
for(Point point : first)
if(distinct.contains(point))
duplicate.add(point);
else
distinct.add(point)
for(Point point : second)
if(distinct.contains(point))
duplicate.add(point);
else
distinct.add(point)
return duplicate;
}
如果你没有使用java.awt.Point
类,那么你的Point类应该有一个覆盖equals()
,看起来像这样:
public class Point
{
public int x;
public int y;
public Point(int x, int y) {this.x=x; this.y=y;}
public Point(){this(0,0);}
@Override
public boolean equals(Object obj)
{
if(obj == null) return false;
if(obj == this) return true;
if(obj.getClass() != Point.class) return false;
Point other = (Point) obj;
return other.x==this.x && other.y==this.y;
}
}
答案 3 :(得分:0)
我认为我不遵循你的想法,但为什么不使用Iterator?
例如:
for (Iterator iter = yourList.iterator(); iter.hasNext(); )
{
Object item = iter.next();
if (YOUR_CONDITION_HERE)
{
iter.remove();
}
}