簡體   English   中英

為什么集合排序方法不能在集合界面上使用

[英]Why collections sort Method cannot be used on set interface

對不起,不好的主題,只是想知道,為什么我們不能在集合上實現排序方法有什么具體原因?

集合意味着沒有順序,數學理論說。 並不是說任何東西都禁止排序集,但這里的目的是按原樣表示數學集概念。

但是,也存在一個排序集接口: SortedSet

如果您只是使用任意 Java Set ,則沒有 API 允許您修改集合的順序。 Set接口沒有修改順序的方法。

如果您願意,您可以編寫一個集合類來實現Set接口,但具有像List這樣的底層順序。 那將是您可以排序的東西。

我不知道你為什么會做這樣的事情; 據我所知,JDK 或任何常用庫中都沒有這樣的類。 我只是不明白這樣的課程有什么意義。 如果您想記住某個訂單,請使用List

sort() 方法不能應用於 Set 實例,甚至 Set 接口本身也沒有任何 sort() 方法,這與 List 接口不同。 這是因為當我們通常在任何 Set Instance 中添加值時,它遵循生成 hashcode 的概念,並根據它們的 hashcode 分配元素以獲得更好的性能並且沒有重復。

設置 numberSet = new HashSet<>();

    numberSet.add(10);
    numberSet.add(100);
    numberSet.add(11);
    numberSet.add(1111);
    numberSet.add(121);

現在 numberSet 將根據它們的哈希碼添加這些值,並且值的檢索也將基於相同的原則完成。

假設我們在 Set 上有一個排序方法,那么假設我們已經對集合進行了排序,並且值根據我們想要的排序上下文進行排列。 然后值將在 Set 數據結構中重新排列(意味着現在由 Set 共享的合同,所有具有相同哈希碼的對象將保存在一個特定位置,該位置將因重新排序而損壞,現在 Set no long 可以執行 O(1) 中的操作,並且根據它的底層實現也不能檢查重復性)。

如果要保留 Set 排序值,有一種方法:

我們可以打開一個流,然后調用 sort() 或 sort(Comparator(? extends T)) 可以在打開流之后調用任何方法。

為了調用這些方法,你的類應該實現 Comparable Interface

  1. sorted() -> 內部使用 compareTo 方法。
  2. sorted(Comparator) -> 使用你的比較器 lambda

流流 = numberSet.stream().sorted((obj1, obj2) -> obj1.getRollNumber() - obj2.getRollNumber());

現在,這些排序方法將返回已排序的 Stream 中的排序值。

但是如果你嘗試做 stream..collect(Collectors.toSet()); 嘗試再次收集集合中的值,現在認為集合包含排序值。 Set 不會以排序的方式保存值,因為它將以集合添加合同的方式保存值(使用哈希碼生成和所有這些,值將以與之前相同的順序添加)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM