检查arraylist是否已排序

时间:2012-01-08 15:34:11

标签: java sorting

  

可能重复:
  How to determine if a List is sorted in Java?

在java中我有带名称的数组列表,如何检查它是否排序?我不希望它被排序。我只是希望它返回true如果是,如果不是则返回false。

到目前为止,我有这个:

public boolean isSorted()
{
    boolean check = false;

    if (Collection.sort(bank, Bank.getOwner()).equals(bank))
    {
        check = true;
    }
    else
    {
        check = false;
    }      
    return check;
}

getOwner返回所有者名称的位置。显然我做错了。

7 个答案:

答案 0 :(得分:5)

显而易见的解决方案:

boolean ascending = true, descending = true;
for (int i = 1; i < arr.length && (ascending || descending); i++) {
    ascending = ascending && arr[i] >= arr[i-1];
    descending = descending && arr[i] <= arr[i-1];
}

答案 1 :(得分:2)

当然不是最有效的选择 - 但可能是最简单的选择:

public boolean isCollectionSorted(List list) {
    List copy = new ArrayList(list);
    Collections.sort(copy);
    return copy.equals(list);
}

执行浅拷贝,对其进行排序,然后比较列表。

答案 2 :(得分:1)

您只想检查列表是否已排序。这是o(n)操作。相反,您正在对列表n * log(n)进行排序,然后比较2个列表o(n)。因此,算法的总成本为n * log(n)+ o(n)。

而是迭代列表并检查当前元素是否大于或等于前一个元素。如果列表应按降序排序,请检查当前元素是否小于或等于先前的元素。

显然,元素的比较可以使用自定义Comparator来完成。

答案 3 :(得分:1)

使用Google Guava,它看起来像这样:

public class Bank {
    public static final Ordering<Bank> OWNER_ORDERING = new Ordering<Bank>() {

        @Override
        public int compare(Bank left, Bank right) {
            return left.getOwner().compareTo(right.getOwner());
        }
    };


    private String owner;

    public Bank(String owner) {
        this.owner = owner;
    }

    public String getOwner() {
        return owner;
    }
}

然后用法:

List<Bank> banks = ImmutableList.of(new Bank("C"), new Bank("B"));
boolean ownerOrdered = Bank.OWNER_ORDERING.isOrdered(banks);

...或直接检索已排序的副本:

List<Bank> sortedCopyBanks = Bank.OWNER_ORDERING.sortedCopy(banks);

答案 4 :(得分:0)

您的解决方案是Ω(n log n)最坏的情况。

最好迭代ArrayList并检查每个元素是否小于/大于下一个元素。

答案 5 :(得分:0)

没有JDK调用可以告诉您是否对Collection进行了排序,您必须实现自己的逻辑来执行此操作。可能有第三方库已经实现了这一点。

答案 6 :(得分:0)

您可以在收藏中创建一个标记,当您sort()收藏时,将该标记转为true。如果您的收藏集中进行了任何修改,例如add() move(),则可以将该标记设置为false。这是您可以找到的优化解决方案,但需要一个标志和一个修改过的集合。