.AsSet (…) herhangi bir API'de var mı?


109

Bir Set oluşturmanın çok basit bir yolunu arıyorum.

Arrays.asList("a", "b" ...) oluşturur List<String>

Benzer bir şey var mı Set?



1
öyle değil, bir Set oluşturmak ve bir Diziyi Set'e dönüştürmek aynı şey değil
cahen

Yanıtlar:


84

Artık Java 8 ile bunu üçüncü taraf çerçeveye ihtiyaç duymadan yapabilirsiniz:

Set<String> set = Stream.of("a","b","c").collect(Collectors.toSet());

Koleksiyonculara bakın .

Zevk almak!


4
Günümüzde Java 8 ile bu muhtemelen en iyi cevaptır çünkü 3. taraf kitaplıklara bağlı değildir ve diğer koleksiyon türlerine kolayca uyarlanabilir, bu yüzden bunu kabul edilen olarak ayarlıyorum. Diğer harika çözümler için herkese çok teşekkürler. (btw, bu Set değiştirilebilir)
cahen

3
Şimdi, Java'nın çok ayrıntılı olduğunu kim söyledi? Tabii ki en iyi cevap bu!
BobDoolittle

Çok teşekkür ederim @BobDoolittle!
Bay Anderson

2
Java 9+ kullanan herkes için lütfen aşağıdaki Holly'nin cevabına da bakın: stackoverflow.com/a/48025159/229743
Taylor

1
kusursuz cevap Bay Anderson!
Gaurav

64

Guava'yı kullanmak bu kadar basit:

Set<String> mySet = ImmutableSet.<String> of("a", "b");

Veya değiştirilebilir bir set için:

Set<String> mySet = Sets.newHashSet("a", "b")

Daha fazla veri türü için Guava kullanıcı kılavuzuna bakın


Bunun değişmez bir versiyonu var mı?
cahen

3
@cahen evet: Sets.newHashSet("a", "b")veyaSets.newLinkedHashSet("a", "b")
Sean Patrick Floyd

1
Cevaba değişebilir bir değişken ekledim.
Michael Schmeißer

aslında, Sets.newLinkedHashSet()bu imzayla mevcut değil, üzgünüm
Sean Patrick Floyd

Tür bağımsız değişkenlerinden birini kaldırabildim:Set<String> mySet = ImmutableSet.of("a", "b");
joshden

55

Kullanabilirsin

new HashSet<String>(Arrays.asList("a","b"));

Bunu yapmayı ve ardından akış sürümünü kullanmayı tercih ederim. "AsList" i statik olarak içe aktarabilirim, bu da bunu daha az ayrıntılı hale getirir.
Marcio Lucca

24

Sıfır veya bir üyeli kümelerin özel durumları için şunları kullanabilirsiniz:

java.util.Collections.EMPTY_SET

ve:

java.util.Collections.singleton("A")

Bu özel durumlar için, standart java.util API'sini kullandığı için muhtemelen en iyi çözümdür
arcuri82

2
java.util.Collections.emptySet()bence, tür güvenliği nedeniyle EMPTY_SET yerine tercih edilir. Koleksiyonlar sınıfındaki yorumlardan:Unlike the like-named field, this method is parameterized.
2018

18

Başkalarının dediği gibi, şunu kullanın:

new HashSet<String>(Arrays.asList("a","b"));

Bu vermez sebebi değil Java mevcut olmasıdır Arrays.asListyani döner sabit bir büyüklükte listesi:

public static void main(String a[])
{
  List<String> myList = Arrays.asList("a", "b");
  myList.add("c");
}

İadeler:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(Unknown Source)
    at java.util.AbstractList.add(Unknown Source)

Sınıf Setiçinde "sabit boyutlu" JDK uygulaması yoktur Arrays. Neden bunu istiyorsun A Set, yineleme olmadığını garanti eder, ancak bunları elle yazıyorsanız, bu işlevselliğe ihtiyacınız olmamalı ... ve Listdaha fazla yönteme sahip olmalısınız . Her iki arayüz de genişler Collectionve Iterable.


Diğerlerinin söylediği gibi, bu işlevselliği gerçekten istiyorsanız guava kullanın - çünkü JDK'da bulunmuyor. Bununla ilgili bilgi için cevaplarına (özellikle Michael Schmeißer'in cevabına) bakın.


3
Bu şimdiye kadarki en iyi cevap çünkü Arrays.asList () işlevinin gerçekte ne yaptığını gösteriyor. Pek çok geliştirici, Arrays.asList () 'in bir java.util.ArrayList oluştururken aslında bir java.util.Arrays $ ArrayList oluşturduğuna inanıyor gibi görünüyor (bu sadece kısmen değiştirilebilir ve temeldeki dizinin canlı bir görünümüdür)
Sean Patrick Floyd

1
Birisinin neden bunu yapmak isteyeceğine gelince, elle bir Set (veya Liste) oluşturmanın en yaygın nedeni, test değerlerini geçtiğiniz bir test sınıfındadır.
Scott McIntyre

14

Java 9'da, fabrika yöntemleriyle benzer işlev eklenmiştir:

Set<String> oneLinerSet = Set.of("a", "b", ...);

(Eşdeğerler Listde vardır.)


Bunu denedim ve bunun bir API yöntemi olmadığına dair bir derleyici uyarısı aldım.
Philippe Gioseffi

İşte ilgili java dokümanı: docs.oracle.com/javase/9/docs/api/java/util/Set.html . Java 9+ JDK kullanmanın yanı sıra, IDE'nizi ayarlamanız veya aracınızı Java 9 uyumluluğunu kullanacak şekilde ayarlamanız gerekebilir (örneğin, maven için buradakilere benzer adımlar olabilir, ancak 1.9: stackoverflow.com/ olarak ayarlanır. sorular / 16798066 /… )
Holly Cummins

Keşke Java 9 kullanabilseydik .. Geçmişte yaşıyoruz! :(
jDub9

bu iyi ama argümanların boyutunda bazı kısıtlamalar var ...
Radoslav Ivanov



2

İşte kullanabileceğiniz küçük bir yöntem

  /**
   * Utility method analogous to {@link java.util.Arrays#asList(Object[])}
   *
   * @param ts
   * @param <T>
   * @return the set of all the parameters given.
   */
  @SafeVarargs
  @SuppressWarnings("varargs")
  public static <T> Set<T> asSet(T... ts) {
    return new HashSet<>(Arrays.asList(ts));
  }

1

Java 8 ve numaralandırmaları kullanarak bunu yapmanın başka bir yolu şudur:

Set<String> set = EnumSet.of(StandardOpenOption.CREATE, StandardOpenOption.READ);

EnumSet konusuna bakın .

Bu yaklaşım arasında bir performans analizi öneririm ve

Set<String> set = Stream.of(StandardOpenOption.CREATE, StandardOpenOption.READ).collect(Collectors.toSet());

çünkü beşten fazla öğeniz varsa , yöntemin javadocu , Set.Of (E, E ...) javadoc'unda görebileceğiniz gibi performans sorunları olabileceğini belirtir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.