[英]Does Java stream().sorted or list.sort() not increases time complexity?
[英]Java 8 List.sort usage
沒有功能差異,因為Collections.sort(list)
調用list.sort(null)
和Collections.sort(list, comparator)
調用list.sort(comparator)
。
所以這只是一種風格問題 - 當提供自己的比較器時,在列表上調用sort可能比使用外部靜態方法更自然和可讀。
但是,如果您只想按自然順序對列表進行排序,則Collections.sort(list)
可能比list.sort(null)
更清晰。
你應該去List.sort
。
使用List.sort
示例,根據元素的長度對String列表進行排序:
List<String> list = new ArrayList<>(Arrays.asList("aa", "aaa", "a"));
list.sort(comparing(String::length));
Collections.sort()
是Java 8之前的做法。 請注意,兩者之間沒有真正的區別。 如果您查看Collections.sort
源代碼,您會注意到它調用list.sort
:
public static <T extends Comparable<? super T>> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
雖然您可以使用List.sort(Comparator)
方法,但此方法的主要目的是重寫。 在Java-8之前,每個List
的排序都有些無效。 首先通過toArray()
方法將列表轉儲到數組中,然后對數組進行排序,最后通過ListIterator.set
更新列表。 在Java-8中,這是List.sort(Comparator)
默認方法中實現的默認行為。 但是,如果可以提供更有效的算法,則可以在子類中更改它。 例子:
ArrayList
和Arrays.asList()
提供自己的sort
實現,直接對內部數組進行排序,因此您無需來回復制。
CopyOnWriteArrayList
現在就可以排序了! 請嘗試以下代碼:
List<String> list = new CopyOnWriteArrayList<>(Arrays.asList("a", "c", "b")); Collections.sort(list);
在Java-7中,它拋出UnsupportedOperationException
,因為支持ListIterator.set
與此列表的思想相矛盾(每個迭代器都迭代獨立快照)。 在Java-8中, ListIterator.set
仍然不受支持,但由於自定義排序實現,此代碼可以正常工作。
Collections.singletonList
和Collections.emptyList
什么都不做(排序0或1元素是無操作),這肯定比創建單元素或零元素數組更快,對其進行排序並迭代列表以設置值。
Collections.unmodifiableList
現在只拋出UnsupportedOperationException
。 在Java-8之前,只有在將不可變列表轉儲到數組之后才會獲得異常,對數組進行排序並開始將其寫回。
這是一個可能在用戶代碼中有用的示例。 假設您要創建某個列表的映射視圖:
public class MappedList<T, R> extends AbstractList<R> {
private final List<T> source;
private final Function<? super T, ? extends R> mapper;
public MappedList(List<T> source, Function<? super T, ? extends R> mapper) {
this.source = source;
this.mapper = mapper;
}
@Override
public R get(int index) {
return mapper.apply(source.get(index));
}
@Override
public int size() {
return source.size();
}
}
用法示例:
List<String> list = Arrays.asList("a", "foo", "bb", "bar", "qq");
List<Integer> mappedList = new MappedList<>(list, String::length);
System.out.println(mappedList); // prints [1, 3, 2, 3, 2]
工作正常,但嘗試Collections.sort(mappedList);
你將得到UnsupportedOperationException
( set
操作不起作用,因為你無法反轉映射功能)。 但是,如果在MappedList
實現sort()
方法,則可以對其進行正確排序(更改原始列表):
@Override
public void sort(Comparator<? super R> c) {
@SuppressWarnings("unchecked")
Comparator<? super T> comparator = c == null ?
Comparator.comparing((Function<? super T, ? extends Comparable<Object>>) mapper) :
Comparator.comparing(mapper, c);
source.sort(comparator);
}
List<String> list = Arrays.asList("a", "foo", "bb", "bar", "qq");
List<Integer> mappedList = new MappedList<>(list, String::length);
Collections.sort(mappedList);
System.out.println(mappedList); // prints [1, 2, 2, 3, 3]
System.out.println(list); // prints [a, bb, qq, foo, bar]
在提供自己的比較器時應該使用它。 例如:
list.sort(Comparator.reverseOrder());
代替:
Collections.sort(list);
Collections.reverse(list);
列表類作為JSR 335更改的一部分,我們可以使用該方法對列表進行排序:
//在List中使用sort方法。
personList.sort((p1,p2) - > p1.firstName.compareTo(p2.firstName));
- 在java 8之前我們只能使用這個tye --- Collections.sort(personList,(p1,p2) - > p1.firstName.compareTo(p2.firstName));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.