我想根据三个要求对列表进行排序。该列表包含将使用以下三个组件的对象ROUTE:利润,总距离和称为apr的整数。
我想以这样的方式添加对象,使列表从头开始保持有序。
我现在提出的是以下我要添加的内容" ROUTE 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
}
}
}
这可行吗?
答案 0 :(得分:1)
您可以在列表中应用修改后的冒泡排序算法。这是关于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;
}
}
}
答案 1 :(得分:0)
Java中的排序依赖于两个接口:Comparable和Comparator。 Comparable根据您想要的任何标准创建元素的自然顺序。比较器可用于对您的数据进行多次排序。
通过少数集合提供的方法sort
对java集合进行排序时,您可以选择使用特定的Comparator。如果您不指定任何内容,则会根据对象的自然顺序对该集合进行排序(通过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
,则可以通过实施二分搜索来更有效地搜索差距。
但是,如果您没有使用List,并且您的路由是唯一的,那么您可以使用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