2012-01-08 122 views
1

可能重複:
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返回所有者名稱。很明顯,我做錯了。

回答

4

顯而易見的解決方案:

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]; 
} 
+4

這可能是比最明顯的解決方案更復雜。 ;) – 2012-01-08 15:44:48

+0

@Peter在循環中添加小快捷方式的誘惑對我來說太強大了。我很弱:( – Voo 2012-01-08 15:51:17

0

您的解決方案是Ω(n log n)最壞的情況。

你會更好過的ArrayList迭代和檢查,如果每個元素是不是下一個更小/大。

1

您只想檢查列表是否已排序。這是o(n)操作。相反,您正在對列表n * log(n)進行排序,然後比較2個列表o(n)。所以,你的算法的總成本是n * log(n)+ o(n)。

取而代之的是迭代列表並檢查當前元素是否大於或等於前一個元素。如果您的列表應按降序排序,請檢查當前元素是否小於或等於之前的值。

顯然元素的比較可以使用自定義Comparator來完成。

0

沒有JDK的呼叫,它可以告訴你,如果一個集合進行排序,你必須實現自己的邏輯來做到這一點。可能有第三方庫已經實現了這一點。

0

肯定不是最有效的選擇 - 但可能是最簡單的:

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

這是執行一個淺拷貝,排序,然後將名單進行比較。

0

你可以在你的收藏中創建一個標誌,當你的收藏sort()時,你將該標誌轉變爲true。如果您的收藏中有任何修改,例如add()move(),則可以將該標誌設置爲false。這是您可以找到的optmizied解決方案,但需要一個標誌和一個修改後的集合。

+0

如何通過刪除一個元素來排序的集合變得沒有排序?) – Voo 2012-01-08 16:11:28

+0

根本不是,好點=] – SHiRKiT 2012-01-08 16:18:52

1

與谷歌番石榴這可能是這樣的:

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);