如何比较 (x,y) 点进行排序,其中 x 总是第一个
How to compare (x,y) points for sorting, where x is always first
我正在使用 Java 比较器将位置对象与点 (x,y) 进行比较。
我需要能够比较两个点以检索正整数或负整数,这将允许我对 (x,y) 点进行排序,其中首先对 x 值进行排序,然后对 y 值进行排序。 (如果这是有道理的......)
例如,这个:
(3,4) (2,5) (1,1) (1,3) (3,3)
变成这样:
(1,1) (1,3) (2,5) (3,3) (3,4)
我想过的一种方法基本上是通过将 x 值乘以一个很大的数字(如 1000)来赋予 x 值较大的优先级。像这样:
比较 (3,3) 和 (1,1):
int x_multiplier = 1000;
int value1 = (p1.x * x_multiplier ) + p1.y; // = 3 * 1000 + 3 = 3003
int value2 = (p2.x * x_multiplier ) + p2.y; // = 1 * 1000 + 1 = 1001
return value1-value2; // = 2002. Value1 is greater, thus p1 be later in list.
这行得通,但问题是如果 Y 值应该等于或大于 x_multiplier,那么它就会失效(因为 y 值现在等于 1 x -价值...再一次,如果这有意义的话。)
// Comparing p1 = (2,0) & p2 = (1,18)
int x_multiplier = 10;
int value1 = (p1.x * x_multiplier ) + p1.y; // = 2 * 10 + 0 = 20
int value2 = (p2.x * x_multiplier ) + p2.y; // = 1 * 10 + 18 = 28
return value1-value2; // = -8, value2 is greater, and thus p2 will be later in the list. However, we know by looking at the points that p2 should come first.
我什至不知道如何搜索这个,所以即使有答案我也找不到。
import java.util.*;
class Tuple {
public int x, y;
Tuple(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "(" + x + ", " + y + ") ";
}
}
public class coord {
public static void main(String[] args) {
LinkedList<Tuple> list = new LinkedList<Tuple>();
list.add(new Tuple(3,4));
list.add(new Tuple(2,5));
list.add(new Tuple(1,1));
list.add(new Tuple(1,3));
list.add(new Tuple(3,3));
for (Tuple t: list) {
System.out.print(t);
}
Collections.sort(list, (Tuple t1, Tuple t2) -> {
int result = Integer.compare(t1.x, t2.x);
if (result == 0 ) result = Integer.compare(t1.y, t2.y);
return result;
});
System.out.println("Sorted List: ");
for (Tuple t: list) {
System.out.print(t);
}
}
}
我正在使用 Java 比较器将位置对象与点 (x,y) 进行比较。
我需要能够比较两个点以检索正整数或负整数,这将允许我对 (x,y) 点进行排序,其中首先对 x 值进行排序,然后对 y 值进行排序。 (如果这是有道理的......) 例如,这个:
(3,4) (2,5) (1,1) (1,3) (3,3)
变成这样:
(1,1) (1,3) (2,5) (3,3) (3,4)
我想过的一种方法基本上是通过将 x 值乘以一个很大的数字(如 1000)来赋予 x 值较大的优先级。像这样: 比较 (3,3) 和 (1,1):
int x_multiplier = 1000;
int value1 = (p1.x * x_multiplier ) + p1.y; // = 3 * 1000 + 3 = 3003
int value2 = (p2.x * x_multiplier ) + p2.y; // = 1 * 1000 + 1 = 1001
return value1-value2; // = 2002. Value1 is greater, thus p1 be later in list.
这行得通,但问题是如果 Y 值应该等于或大于 x_multiplier,那么它就会失效(因为 y 值现在等于 1 x -价值...再一次,如果这有意义的话。)
// Comparing p1 = (2,0) & p2 = (1,18)
int x_multiplier = 10;
int value1 = (p1.x * x_multiplier ) + p1.y; // = 2 * 10 + 0 = 20
int value2 = (p2.x * x_multiplier ) + p2.y; // = 1 * 10 + 18 = 28
return value1-value2; // = -8, value2 is greater, and thus p2 will be later in the list. However, we know by looking at the points that p2 should come first.
我什至不知道如何搜索这个,所以即使有答案我也找不到。
import java.util.*;
class Tuple {
public int x, y;
Tuple(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "(" + x + ", " + y + ") ";
}
}
public class coord {
public static void main(String[] args) {
LinkedList<Tuple> list = new LinkedList<Tuple>();
list.add(new Tuple(3,4));
list.add(new Tuple(2,5));
list.add(new Tuple(1,1));
list.add(new Tuple(1,3));
list.add(new Tuple(3,3));
for (Tuple t: list) {
System.out.print(t);
}
Collections.sort(list, (Tuple t1, Tuple t2) -> {
int result = Integer.compare(t1.x, t2.x);
if (result == 0 ) result = Integer.compare(t1.y, t2.y);
return result;
});
System.out.println("Sorted List: ");
for (Tuple t: list) {
System.out.print(t);
}
}
}