以两种不同的方式对列表进行排序,一个接一个

时间:2016-03-05 15:44:52

标签: java list sorting

我需要根据“Prioridade”属性对列表进行排序,之后,我需要将所有元素isConsumido()= true放到列表的末尾,我该怎么做?

我尝试了这个,但是循环了。

public void ordenar(List<ItemCultural> array) {
    int i;
    boolean a = true;
    while (a) {
        a = false;
        for (i = 0; i < array.size() - 1; i++) {
            if (array.get(i).getPrioridade() < array.get(i + 1).getPrioridade()) {
                Collections.swap(array, i, i + 1);
                a = true;
            }
        }
    }

    a = true;
    while (a){
        a = false;
        for (i = 0; i < array.size() - 1; i++) {
            if (array.get(i).isConsumido()) {
                Collections.swap(array, i, array.size()-1);
                a = true;
            }
        }
    }
}

getPrioridade()返回一个int,isConsumido返回true或false。谢谢!

3 个答案:

答案 0 :(得分:0)

无需排序两次,只需根据您拥有的两个标准实施Comparator或类似标准:主要标准是isConsumido(放置标准在最后的情况下,次要标准是相对先验:

yourList.sort(new Comparator<ItemCultural>() {
    public int compare(ItemCultural a, ItemCultural b) {
        int result;
        if (a.isConsumido()) {
            result = b.isConsumido() ? 0 : 1;
        } else {
            result = b.isConsumido() ? -1 : 0;
        }
        if (result == 0) {
            result = a.getPrioridade() - b.getPrioridade();
        }
        return result;
    }
});

Live Example

(上面我使用yourList而不是array作为变量的名称。调用引用List&#34;的变量array&#34;既奇怪又有误导性。)

答案 1 :(得分:0)

您只需尝试删除元素并将其添加回列表即可。

它会将元素推送到列表的末尾,并且不需要while循环:

[编辑]

int k = 0;
for (i = 0; i < array.size()-k; i++) {
            if (array.get(i).isConsumido()) {
                ItemCultural item = array.remove(i);
                array.add(item);
                k++;
                i--;
            }
}

答案 2 :(得分:-1)

我会在ItemCultural中实现Comparable并使用Collections.sort(array)。我无法理解“isConsumido()= true”部分代码。