Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查arraylist是否已排序_Java_Sorting - Fatal编程技术网

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在循环中添加小快捷方式的诱惑对我来说太强烈了。。我很弱:(通过删除元素,一个已排序的集合将如何变成未排序的?;)