在Java中將List
轉換爲Set
的最簡單方法是什麼?將列表轉換爲Java集合的最簡單方法
回答
Set<Foo> foo = new HashSet<Foo>(myList);
我同意sepp2k,但也有可能的一些其他細節:
new HashSet<Foo>(myList);
會給你一個無序集不有重複。在這種情況下,使用對象上的.equals()方法識別重複。這與.hashCode()方法結合使用。 (欲瞭解更多關於平等看看here)
,給出了一個有序集合另一種方法是:
new TreeSet<Foo>(myList);
這個工作,如果美孚實現媲美。如果沒有,那麼你可能需要使用一個比較:
Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);
這取決於任何的compareTo()(從可比接口)或比較()(從比較器),以確保其唯一性。所以,如果您只關心唯一性,請使用HashSet。如果您在排序後,請考慮TreeSet。 (記住:稍後優化!)如果時間效率問題在空間效率問題上使用HashSet,請查看TreeSet。請注意,更高效的Set和Map實現可以通過Trove(和其他位置)獲得。
+1使用ImmutableSet – tomrozb 2013-05-03 14:28:44
ImmutableSet.copyOf爲什麼更好? – user672009 2016-04-14 09:05:39
Guava的newHashSet()對基本的Java新HashSet()有什麼優勢? – 2016-05-16 15:20:36
Set<E> alphaSet = new HashSet<E>(<your List>);
或完整的例子
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ListToSet
{
public static void main(String[] args)
{
List<String> alphaList = new ArrayList<String>();
alphaList.add("A");
alphaList.add("B");
alphaList.add("C");
alphaList.add("A");
alphaList.add("B");
System.out.println("List values .....");
for (String alpha : alphaList)
{
System.out.println(alpha);
}
Set<String> alphaSet = new HashSet<String>(alphaList);
System.out.println("\nSet values .....");
for (String alpha : alphaSet)
{
System.out.println(alpha);
}
}
}
+1爲一個完整的代碼示例。此處還有一點需要注意的是,哈希不保證從運行到運行都是相同的。這意味着在「設置值.....」後面打印的列表可能是「ABC」一次運行,「CBA」另一次運行。正如我在我的回答中提到的那樣,您可以使用樹組來獲得穩定的順序。另一種選擇是使用LinkedHashSet,它記住項目添加到它的順序。 – Spina 2013-09-23 12:45:32
我會在轉換之前進行空檢查設置。
if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}
或'設置
您可以轉換List<>
到Set<>
Set<T> set=new HashSet<T>();
//Added dependency -> If list is null then it will throw NullPointerExcetion.
Set<T> set;
if(list != null){
set = new HashSet<T>(list);
}
我想你的意思是將它從List設置爲Set。 – Simon 2014-12-27 15:49:50
用java 8,你可以使用流:
List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));
你檢查過這個表現嗎?這會做一個迭代+迭代器,一個新的HashSet(),然後爲每個列表項添加一個addAll()調用。總的來說,cca。創建了5個對象,像一個新的HashSet(列表)一樣簡單。 – 2016-10-17 09:17:54
有各種不同的方式來獲得一個Set
爲:
List<Integer> sourceList = new ArrayList();
sourceList.add(1);
sourceList.add(2);
sourceList.add(3);
sourceList.add(4);
// Using Core Java
Set<Integer> set1 = new HashSet<>(sourceList); //needs null-check if sourceList can be null.
// Java 8
Set<Integer> set2 = sourceList.stream().collect(Collectors.toSet());
Set<Integer> set3 = sourceList.stream().collect(Collectors.toCollection(HashSet::new));
//Guava
Set<Integer> set4 = Sets.newHashSet(sourceList);
// Apache commons
Set<Integer> set5 = new HashSet<>(4);
CollectionUtils.addAll(set5, sourceList);
當我們使用Collectors.toSet()
時,它返回一個集合並按照文檔:There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned
。如果我們想獲得HashSet
,那麼我們可以使用另一種替代方法來獲得一組(檢查set3
)。
對於Java 8這很容易:
List <UserEntity> vList= new ArrayList<UserEntity>();
vList= service(...);
Set<UserEntity> vSet= vList.stream().collect(Collectors.toSet());
讓我們不要忘記我們的相對較新的朋友,java-8流API。 如果你將其轉換爲一組前需要預處理列表,最好是有類似:
list.stream().<here goes some preprocessing>.collect(Collectors.toSet());
與Optional.ofNullable
Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);
一個更多的Java 8彈性的解決方案使用Java 10,你現在就可以使用Set#copyOf
容易地一個List<E>
轉換爲不可修改Set<E>
:
實施例:
var set = Set.copyOf(list);
請記住,這是一個無序的操作,並null
元素不允許的,因爲它會拋出一個NullPointerException
。
如果您希望它是可修改的,那麼只需將它傳遞給構造函數Set
的實現。
- 1. Java中將String轉換爲UUID的最簡單方法
- 2. 將Rails表單轉換爲AJAX表單的簡單方法?
- 3. 將Access列轉換爲SQL列的更簡單的方法
- 4. 將枚舉轉換爲集合/列表
- 5. 如何將集合轉換爲列表?
- 6. 簡單的方法將c代碼轉換爲x86程序集?
- 7. 將java.util.HashSet轉換爲Clojure集合的最佳方法
- 8. 將swf橫幅廣告轉換爲html的最簡單方法
- 9. 最簡單的方法將int轉換爲UInt32按位?
- 10. 將EJB 2.0項目轉換爲EJB 3.0的最簡單方法
- 11. 將unicode代碼轉換爲UTF-8的最簡單方法
- 12. 將TXT批量轉換爲PDF的最簡單方法
- 13. 將ndarray轉換爲cv :: Mat的最簡單方法是什麼?
- 14. 將xml轉換爲html最簡單的方法是什麼?
- 15. 將Blob轉換爲字節數組的最簡單方法
- 16. 將Json轉換爲Xml的最簡單方法
- 17. 將數字轉換爲年和月的最簡單方法
- 18. 將NSString轉換爲Cocoa等價貨幣的最簡單方法
- 19. 將非泛型集合轉換爲泛型集合的最佳方法
- 20. 將多個集合合併到Java流中的最簡單方法是什麼?
- 21. 將無序列表拆分爲兩列的最簡單方法
- 22. Java:將日曆轉換爲字符串並返回的最簡單方法
- 23. 在java中將字節數組轉換爲Blob的最簡單方法
- 24. Java集合將字符串轉換爲字符列表
- 25. 如何以最簡單的方式將字符串轉換爲列表
- 26. 最簡單的方法將mysql表「按原樣」轉換爲xml文檔?
- 27. 將表格標籤轉換爲標準css最簡單的方法是什麼?
- 28. 將嵌套列表轉換爲Clojure中的集合列表?
- 29. 如何將使用XPath的簡單C#方法轉換爲Java方法?
- 30. 無法將MongoDB集合轉換爲列表
這將拋出NullPointerException如果列表爲空 – Ashish 2014-05-13 14:46:18
@Ashish:這是完全不相關的問題。沒有人問如何將null轉換爲Set。總是要求處理null的人是Java(文化)如何被破壞的標誌。幾乎總是,null是一個錯誤。拋出異常實際上是你能做的最好的事情。特別是當它是對集合的空引用時:您多久可以想象集合的空引用的語義含義 - 並且這樣的含義與空集合不同? – 2016-02-06 16:34:33
同意,而不是null,您應該(幾乎)始終傳遞:bean的不可變靜態空實例,或Collection.emptyXXX()。如果它在每個方法開始時沒有被空值檢查污染,它也使得你的代碼更容易閱讀。 – 2016-10-17 09:20:02