在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返回所有者名称的位置。显然我做错了。
答案 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。这是您可以找到的优化解决方案,但需要一个标志和一个修改过的集合。