Java 检查arraylist是否已排序
可能重复:Java 检查arraylist是否已排序,java,sorting,Java,Sorting,可能重复: 在java中,我有带名称的数组列表,如何检查它是否排序?我不想把它分类。我只希望它返回true(如果是),false(如果不是) 到目前为止,我有: public boolean isSorted() { boolean check = false; if (Collection.sort(bank, Bank.getOwner()).equals(bank)) { check = true; } else {
在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返回所有者名称。显然我做错了。您的解决方案是Ω(n logn)最坏情况
您最好遍历ArrayList并检查每个元素是否小于/大于下一个元素。您只想检查列表是否已排序。这是o(n)操作。而是对列表n*log(n)进行排序,然后比较两个列表o(n)。所以,您的算法的总成本是n*log(n)+o(n) 相反,只需迭代列表并检查当前元素是否大于或等于前一个元素。如果列表应按降序排序,请检查当前元素是否小于或等于上一个元素 显然,可以使用自定义的
比较器来比较元素 显而易见的解决方案:
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];
}
布尔升序=true,降序=true;
对于(int i=1;i=arr[i-1];
descending=descending&&arr[i]没有JDK调用可以告诉您是否对集合进行了排序,您必须实现自己的逻辑才能做到这一点。可能有第三方库已经实现了这一点。当然不是最有效的选项,但可能是最简单的:
public boolean isCollectionSorted(List list) {
List copy = new ArrayList(list);
Collections.sort(copy);
return copy.equals(list);
}
这将执行浅复制,对其排序,然后比较列表。您可以在集合中创建一个标志,当您对集合进行sort()
时,将该标志转换为true
。如果在集合中进行了任何修改,如add()
move()
,您可以将标志设置为false。这是您可以找到的优化解决方案,但需要标志和修改的集合。使用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;
}
}
公共类银行{
公共静态最终订购所有者\u订购=新订购(){
@凌驾
公共整数比较(左行,右行){
返回left.getOwner().compareTo(right.getOwner());
}
};
私人字符串所有者;
公共银行(字符串所有者){
this.owner=所有者;
}
公共字符串getOwner(){
归还所有人;
}
}
用法如下:
List<Bank> banks = ImmutableList.of(new Bank("C"), new Bank("B"));
boolean ownerOrdered = Bank.OWNER_ORDERING.isOrdered(banks);
List banks=ImmutableList.of(新银行(“C”)、新银行(“B”);
布尔ownerOrdered=Bank.OWNER\u ORDERING.isOrdered(banks);
…或直接检索已排序的副本:
List<Bank> sortedCopyBanks = Bank.OWNER_ORDERING.sortedCopy(banks);
List sortedCopyBanks=Bank.OWNER\u ORDERING.sortedCopy(banks);
这可能比最明显的解决方案更复杂。@Peter在循环中添加小快捷方式的诱惑对我来说太强烈了。。我很弱:(通过删除元素,一个已排序的集合将如何变成未排序的?;)