我希望在一组点数组中找到唯一的点(即删除所有的重复项并查看剩下的部分)。
下面是我尝试过的代码:
int numCount = 0;
for (int x = 0; x < ALLARRAYS.length; x++) {
for (final Point test : ALLARRAYS[x]) {
NUMBER: for (final Point[] numbers : ALLARRAYS) {
if (numbers == ALLARRAYS[x]) {
continue;
}
for (int i = 0; i < numbers.length; i++) {
if (test.equals(numbers[i])) {
break NUMBER;
} else {
if (i == numbers.length - 1) {
numCount++;
}
}
}
}
if (numCount == 10) {
System.out.println(x + "\tPoint: " + test.x + ", " + test.y + " is unique.");
}
numCount = 0;
}
System.out.println();
}基本上,我有11个要检查的数组,因此numCount检查待确认的10个数组。我的方法是遍历每个数组,然后遍历数组中的所有点,然后循环遍历其他数组中的每个点。如果它看到一个重复,它会跳过整个数字。
我的问题:我得到了错误的读数。我不知道是怎么回事,但是这个程序发出了其他数组中已经存在的点。
我的目标:每个数组作为一个整体工作。如果一个元素不满足,则跳过整个数组。我的最终结果应该是11个大小较小的数组,它们都是唯一的,这样一个方法就可以检查每个集合的元素并确定它们都是唯一的。
注意:数组现在都是独一无二的,它们非常庞大。我正在寻找一种方法来截断它通过创建这个迷你程序,以消除重复。
我的问题:能请人帮帮我吗?
发布于 2012-05-04 23:44:54
您的代码似乎检查了有关Point的所有数组,包括您要查找的Point出现的数组。因此,您的代码将始终找到它正在寻找的Point,最终将没有结果。
你可能需要这样做:
NUMBER: for (final Point[] numbers : ALLARRAYS) {
if (numbers == array) {
continue; // skip the array that contains 'test'
}
...
}这样,您将跳过包含test元素的数组。
发布于 2012-05-04 23:36:57
将所有数组条目放在一个集合中,它将跳过重复项。
只需确保正确地覆盖Point类上的equals方法,因为Set接口的实现将使用它。
HTH
发布于 2012-05-05 00:24:02
数组不适合您的工作。不仅它们没有交叉或removeAll这样的方法,而且它们很难更改,特别是当您想缩小它们的大小时。
为了避免这种麻烦,我将一个点标为removed,将x和y设为-1,当然一个坐标就足够了,但出于对称的原因.
import java.util.*;
import java.awt.Point;
public class RandPoints
{
Random r = new Random ();
Point [][] arr;
public void removeDuplicatesFrom2 (Point [] pa, Point [] pb) {
for (Point p : pb) {
if (p.x != - 1 && Arrays.asList (pa).contains (p)) {
// System.out.println ("dup: " + p.x + " " + p.y);
p.x = -1;
p.y = -1;
}
}
}
// create a random point in range (0..19)(0..19)
public Point randpoint () {
return new Point (r.nextInt (20), r.nextInt (20));
}
// create 10 (default) arrays of size 100 (default)
public void init (int arrsize, int arrcount)
{
arr = new Point [arrcount][];
for (int c = 0; c < arrcount; ++c)
{
Point [] points = new Point [arrsize];
for (int s = 0; s < arrsize; ++s)
{
Point p = randpoint ();
points[s] = p;
}
arr[c] = points;
}
}
public void unify ()
{
for (Point[] pac0 : arr) {
for (Point[] pac1 : arr)
{
if (pac0 != pac1)
removeDuplicatesFrom2 (pac0, pac1);
}
}
}
/**
fill arrays with duplicates by random,
show, delete and show again.
*/
public RandPoints (int arrsize, int arrcount)
{
init (arrsize, arrcount);
show ();
unify ();
System.out.println ();
show ();
}
public static void main (String args[])
{
int arrsize = 100;
int arrcount = 10;
if (args.length == 2)
{
arrsize = Integer.parseInt (args[0]);
arrcount = Integer.parseInt (args[1]);
}
new RandPoints (arrsize, arrcount);
}
// visible feedback is always welcome while debugging/testing
public void show ()
{
for (Point[] pa: arr) {
for (Point point: pa)
if (point.x != -1 && point.y != -1)
System.out.print (point.x + ", " + point.y + "\t");
System.out.println ();
}
}
}我对代码做了一些修改,使值(20)的最大范围也可以配置。
从一开始
java RandPoints 16 10 10
3, 0 9, 0 6, 9 2, 3 6, 9 7, 4 9, 9 2, 5 8, 7 3, 3 9, 5 3, 7 0, 5 7, 6 0, 4 8, 1
6, 1 2, 7 2, 5 6, 7 0, 7 5, 8 4, 2 1, 9 8, 4 5, 7 0, 2 3, 1 1, 9 2, 1 8, 0 1, 7
5, 4 9, 7 9, 3 7, 3 1, 2 9, 6 0, 4 6, 0 3, 0 7, 7 1, 3 1, 1 5, 3 3, 8 1, 0 4, 9
4, 7 8, 9 4, 0 0, 2 8, 7 5, 8 7, 0 1, 4 4, 9 8, 2 6, 9 9, 6 2, 1 1, 9 0, 8 6, 5
6, 8 9, 6 1, 0 6, 9 4, 0 5, 1 2, 9 7, 3 5, 1 2, 5 6, 9 0, 9 7, 4 8, 1 5, 5 3, 4
5, 9 0, 4 5, 4 2, 2 2, 6 7, 1 2, 0 6, 1 0, 4 9, 8 5, 7 5, 5 4, 6 9, 0 2, 8 8, 5
8, 2 4, 2 0, 8 1, 1 0, 3 3, 4 1, 8 3, 1 6, 6 4, 1 3, 6 6, 0 1, 7 4, 8 1, 6 1, 1
6, 2 1, 3 2, 4 0, 8 9, 0 3, 0 1, 1 3, 7 6, 2 2, 4 0, 9 3, 6 7, 2 1, 2 5, 0 8, 2
2, 3 5, 6 7, 9 3, 0 9, 3 2, 6 4, 8 8, 7 9, 4 5, 3 0, 3 3, 0 5, 5 1, 4 6, 4 5, 2
3, 2 4, 9 6, 9 4, 7 7, 1 0, 4 5, 8 7, 2 5, 2 5, 5 2, 1 9, 8 4, 9 6, 6 7, 7 0, 3
3, 0 9, 0 6, 9 2, 3 6, 9 7, 4 9, 9 2, 5 8, 7 3, 3 9, 5 3, 7 0, 5 7, 6 0, 4 8, 1
6, 1 2, 7 6, 7 0, 7 5, 8 4, 2 1, 9 8, 4 5, 7 0, 2 3, 1 1, 9 2, 1 8, 0 1, 7
5, 4 9, 7 9, 3 7, 3 1, 2 9, 6 6, 0 7, 7 1, 3 1, 1 5, 3 3, 8 1, 0 4, 9
4, 7 8, 9 4, 0 7, 0 1, 4 8, 2 0, 8 6, 5
6, 8 5, 1 2, 9 5, 1 0, 9 5, 5 3, 4
5, 9 2, 2 2, 6 7, 1 2, 0 9, 8 4, 6 2, 8 8, 5
0, 3 1, 8 6, 6 4, 1 3, 6 4, 8 1, 6
6, 2 2, 4 6, 2 2, 4 7, 2 5, 0
5, 6 7, 9 9, 4 6, 4 5, 2
3, 2 https://stackoverflow.com/questions/10457399
复制相似问题