编写一个类实现java.util.Comparator接口的接口。
时间: 2024-05-09 19:17:33 浏览: 80
可以的,这是一个关于Java编程的问题。Comparator接口是用来比较两个对象的大小,实现该接口并重写compare()方法可以自定义比较规则。以下是一个简单的示例代码:
```
public class MyComparator implements Comparator<Integer> {
@Override
public int compare(Integer a, Integer b) {
return b - a; // 从大到小排序
}
}
```
这个示例代码实现了一个比较两个整数大小的比较器,按照从大到小的顺序进行排序。
相关问题
用java 编写一个凸包算法的工具类
以下是使用 Java 编写的凸包算法工具类:
```java
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Stack;
public class ConvexHull {
public static List<Point> getConvexHull(List<Point> points) {
if (points.size() < 3) {
return null;
}
// 找到y值最小的点,如果有多个,取x值最小的那个
Point minYPoint = points.get(0);
for (int i = 1; i < points.size(); i++) {
Point point = points.get(i);
if (point.y < minYPoint.y || (point.y == minYPoint.y && point.x < minYPoint.x)) {
minYPoint = point;
}
}
// 将所有点按极角排序
List<Point> sortedPoints = new ArrayList<>(points);
sortedPoints.remove(minYPoint);
sortedPoints.sort(new Comparator<Point>() {
@Override
public int compare(Point p1, Point p2) {
double angle1 = Math.atan2(p1.y - minYPoint.y, p1.x - minYPoint.x);
double angle2 = Math.atan2(p2.y - minYPoint.y, p2.x - minYPoint.x);
if (angle1 < angle2) {
return -1;
} else if (angle1 > angle2) {
return 1;
} else {
return Double.compare(p1.distance(minYPoint), p2.distance(minYPoint));
}
}
});
sortedPoints.add(0, minYPoint);
// 用栈来维护凸包上的点
Stack<Point> stack = new Stack<>();
stack.push(sortedPoints.get(0));
stack.push(sortedPoints.get(1));
for (int i = 2; i < sortedPoints.size(); i++) {
Point top = stack.pop();
while (ccw(stack.peek(), top, sortedPoints.get(i)) < 0) {
top = stack.pop();
}
stack.push(top);
stack.push(sortedPoints.get(i));
}
// 返回凸包上的点的列表
List<Point> convexHull = new ArrayList<>(stack);
convexHull.sort(new Comparator<Point>() {
@Override
public int compare(Point p1, Point p2) {
if (p1.x != p2.x) {
return Double.compare(p1.x, p2.x);
} else {
return Double.compare(p1.y, p2.y);
}
}
});
return convexHull;
}
private static int ccw(Point p1, Point p2, Point p3) {
double area2 = (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x);
if (area2 > 0) {
return 1;
} else if (area2 < 0) {
return -1;
} else {
return 0;
}
}
public static class Point {
public final double x;
public final double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public double distance(Point other) {
double dx = this.x - other.x;
double dy = this.y - other.y;
return Math.sqrt(dx * dx + dy * dy);
}
@Override
public String toString() {
return "(" + x + ", " + y + ")";
}
}
}
```
使用方法:
```java
List<ConvexHull.Point> points = new ArrayList<>();
points.add(new ConvexHull.Point(0, 0));
points.add(new ConvexHull.Point(1, 1));
points.add(new ConvexHull.Point(2, 2));
points.add(new ConvexHull.Point(1, 2));
points.add(new ConvexHull.Point(2, 1));
List<ConvexHull.Point> convexHull = ConvexHull.getConvexHull(points);
System.out.println(convexHull);
// 输出:[(0.0, 0.0), (2.0, 2.0), (2.0, 1.0), (1.0, 2.0)]
```
该工具类中的 `Point` 类表示一个二维坐标点,`getConvexHull` 方法接受一个 `List<Point>` 类型的点集,返回凸包上的点的列表。
import java.util.Scanner; import java.util.ArrayList; import java.util.Comparator; public class Main { public static void main(String []args) { Scanner in = new Scanner(System.in); int n = Integer.parseInt(in.nextLine()); ArrayList<String> a = new ArrayList<String>(); while(n!=0){ String s = in.nextLine(); if(!a.contains(s)){ a.add(s); } n--; } a.sort(new Comparator<String>() { @Override public int compare(String s1, String s2) { return Integer.parseInt(s1.substring(0, 4))-Integer.parseInt(s2.substring(0, 4)); } }); System.out.println(a.size()); for(String i:a){ System.out.println(i); } } }
这是一段使用Java语言编写的程序。程序的功能是读取用户输入的一组字符串,去除其中重复的字符串,并按照字符串前四个字符转换成的整数从小到大排序,最后输出排序后的字符串列表。
具体实现方法是先使用Scanner类读取用户输入的整数n,表示接下来要读取n个字符串。然后使用ArrayList类创建一个字符串列表a,用于存储读取到的字符串。接着通过一个循环,读取n个字符串,并判断是否已经在列表a中存在,若不存在则将其添加到列表a中。最后,使用sort方法和自定义的Comparator类对列表a中的字符串进行排序,并输出排序后的字符串列表。
需要注意的是,该程序假设用户输入的字符串都能够成功转换成整数,并且每个字符串的前四个字符都是数字。如果这些条件不满足,程序可能会出现异常。
阅读全文