如何根据三个要求对列表进行排序?

时间:2016-05-23 13:10:41

标签: list sorting

我想根据三个要求对列表进行排序。该列表包含将使用以下三个组件的对象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
                }
            }
        }

这可行吗?

2 个答案:

答案 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