如何根据三个要求对列表进行排序?
我想根据三个要求分类列表。该列表包含将使用以下三个组件的对象ROUTE:利润,总距离和一个名为apr的整数。如何根据三个要求对列表进行排序?
我想以这样一种方式添加对象,使列表从开始处保持排序。
我想出什么了现在下面,我想“路线R'”添加到列表中
for (int j = 0; j < POOL.size()-1; j++)
{
if (apr(r) > apr(j))
{
// do nothing
}
else if (apr(r) < apr(j))
{
POOL.add(j,r)
}
else if (apr(r) == apr(j))
{
if (profit(r) > profit(j))
{
// do nothing
}
else if (profit(r) < profit(j))
{
POOL.add(j, r)
}
else if (profit(r) == profit(j))
{
if (distance(r) > distance(j))
{
// do nothing
}
else if (distance(r) < distance(j))
{
POOL.add(j,r)
}
else if (distance(r) == distance(j))
{
//add
}
}
}
莫非
这项工作得不错吗?
在Java中排序依赖于两个接口:可比和比较器。根据您想要的标准,“可比”会创建元素的自然排序。比较器可用于对您的数据进行多次排序。
当通过少数集合提供的方法sort
对java集合进行排序时,可以选择使用特定的比较器。如果不指定任何内容,则集合将根据对象的自然顺序进行排序(通过Comparable)。
让我们看看现在这些东西的实现。
可比版本
public class Route implements Comparable<Route> {
private String apr;
private int distance;
private int profit;
@Override
public int compareTo(Route other) {
int aprCompare = apr.compareTo(other.apr);
if (aprCompare != 0) return aprCompare;
else if (profit < other.profit) return -1;
else if (profit > other.profit) return 1;
else if (distance < other.distance) return -1;
else if (distance > other.distance) return 1;
else return 0;
}
}
比较版本
比较是一个对象,做了排序为您。按照惯例,比较器与它所比较的类不同。所以,让我们写一个:
public class RouteComparator implements Comparator<Route> {
@Override
public int compare(Route a, Route b) {
int aprCompare = a.getApr().compareTo(b.getApr());
if (aprCompare != 0) return aprCompare;
else if (a.getProfit() < b.getProfit()) return -1;
else if (a.getProfit() > b.getProfit()) return 1;
else if (a.getDistance() < b.getDistance()) return -1;
else if (a.getDistance() > b.getDistance()) return 1;
else return 0;
}
}
排序列表
假设你有一堆列表未排序的数据,你需要插入新的之前给它排序。要使用Comparable接口对List<Rout> list
进行排序,请致电list.sort(null)
。如果您想使用比较器,请致电list.sort(new RouteComparator())
。很简单,你的清单是有效的排序。
如何插入数据,同时保持顺序
这是一个列表,所以最简单的方法是插入数据,同时确保其有序是遍历列表,直到找到一个缺口,插入新Route
在那个差距。如果您使用的是ArrayList
,则可以通过执行二进制搜索来搜索差距,从而更高效地执行此操作。
但是,如果您没有绑定使用列表,并且您的路由是唯一的,那么您可以使用TreeSet,这是一个有序的数据结构。最好的是,它也使用Comparable/Comparator,你只需在创建时指定它:
TreeSet<Route> t = new TreeSet<>();
// Creates a new TreeSet with the natural ordering of Route
TreeSet<Route> t = new TreeSet<>(new RouteComparator());
// Creates a new TreeSet using a Comparator
那么你可以在你的列表中应用一个修改过的Bubble排序算法。这是关于Java(未测试)的示例中,假设对象的与值,利润和距离特性的阵列作为整数
for(int i = 0; i < array.length; i++) {
for(int j = 0; j < array.length-1; j++) {
if(array[j].value > array[j+1].value ||
(array[j].value == array[j+1].value && array[j].profit > array[j+1].profit) ||
(array[j].value == array[j+1].value && array[j].profit == array[j+1].profit && array[j].distance > array[j+1].distance)) {
int k = array[j];
array[j] = array[j+1];
array[j+1] = k;
}
}
}
你有没有尝试过任何代码? –
你想使用什么语言? (如果有的话) –
我一直在考虑代码,但还没有能够提出任何问题。我在Eclipse中编写代码(Java 1.8)@HopefulLlama –