.asSet (…)이 API에 있습니까?


답변:


84

이제 Java 8을 사용하면 타사 프레임 워크없이이 작업을 수행 할 수 있습니다.

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

수집기를 참조하십시오 .

즐겨!


4
요즘 Java 8에서는 타사 라이브러리에 의존하지 않고 다른 컬렉션 유형에 쉽게 적용 할 수 있기 때문에 이것이 아마도 가장 좋은 대답 일 것입니다. 그래서 이것을 허용되는 것으로 설정합니다. 다른 훌륭한 솔루션에 대해 모두에게 감사드립니다. (BTW,이 설정은 변경 가능한)
cahen

3
자, 자바가 너무 장황하다고 누가 말했습니까? 물론 이것이 최선의 대답입니다!
BobDoolittle

감사합니다 @BobDoolittle!
앤더슨

2
java 9+를 사용하는 사람은 아래 Holly의 답변도 참조하십시오. stackoverflow.com/a/48025159/229743
Taylor

1
완벽한 대답 앤더슨 씨!
gaurav

63

Guava를 사용하면 다음 과 같이 간단합니다.

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

또는 변경 가능한 세트의 경우 :

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

더 많은 데이터 유형은 Guava 사용자 가이드를 참조하세요.


변경 불가능한 버전이 있습니까?
cahen 2013 년

3
@cahen 예 : Sets.newHashSet("a", "b")또는Sets.newLinkedHashSet("a", "b")
Sean Patrick Floyd

1
대답에 가변 변형을 추가했습니다.
Michael Schmeißer 2013 년

사실, Sets.newLinkedHashSet()그 서명으로 존재하지 않습니다. 죄송합니다
Sean Patrick Floyd

유형 인수 중 하나를 제거 할 수있었습니다.Set<String> mySet = ImmutableSet.of("a", "b");
joshden

54

당신은 사용할 수 있습니다

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

24

0 개 또는 1 개의 멤버가있는 특수한 경우 세트의 경우 다음을 사용할 수 있습니다.

java.util.Collections.EMPTY_SET

과:

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

이 표준 java.util의 API를 사용하여 이러한 특별한 경우에, 그것은 가능성이 최선의 해결책이다
arcuri82

2
java.util.Collections.emptySet()제 생각에는 유형 안전성 때문에 EMPTY_SET보다 선호됩니다. 컬렉션 클래스의 댓글에서 :Unlike the like-named field, this method is parameterized.
Eddified

17

다른 사람들이 말했듯이 다음을 사용하십시오.

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

이것이 Java에 존재 하지 않는 이유 Arrays.asList는 고정 된 크기의 목록 을 반환하기 때문입니다.

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

보고:

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

클래스 Set내부에는 "고정 크기"의 JDK 구현이 없습니다 Arrays. 왜 이것을 원합니까? A Set는 중복이 없음을 보장하지만 직접 입력하는 경우 해당 기능이 필요하지 않으며 List더 많은 메서드가 있습니다. 두 인터페이스 모두 확장 CollectionIterable.


다른 사람들이 말했듯이, 이 기능을 정말로 원한다면 구아바를 사용하십시오 -JDK에 없기 때문입니다. 이에 대한 정보는 그들의 답변 (특히 Michael Schmeißer의 답변)을 참조하십시오.


3
이것은 Arrays.asList ()가 실제로하는 일을 지적하기 때문에 지금까지 가장 좋은 대답입니다. 많은 개발자들은 Arrays.asList ()가 java.util.ArrayList를 생성하는 반면 실제로는 java.util.Arrays $ ArrayList (부분적으로 만 변경 가능하고 기본 배열의 라이브 뷰)를 생성한다고 생각하는 것 같습니다.
Sean Patrick Floyd

1
누군가가 이것을하고 싶어하는 이유에 관해서, 손으로 집합 (또는 목록)을 구성하는 가장 일반적인 이유는 테스트 값을 전달하는 테스트 클래스에 있습니다.
Scott McIntyre

14

Java 9에서 유사한 기능이 팩토리 메소드를 통해 추가되었습니다.

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

(동등한 List것도 있습니다.)


나는 이것을 시도했고 이것이 API 메소드가 아니라는 컴파일러 경고를 받았습니다.
Philippe Gioseffi

다음은 관련 자바 문서입니다 : docs.oracle.com/javase/9/docs/api/java/util/Set.html . Java 9+ JDK를 사용하는 것 외에도 Java 9 준수를 사용하도록 IDE 또는 빌드 도구를 조정해야 할 수 있습니다 (예를 들어, maven의 경우 여기와 유사한 단계이지만 1.9로 설정됩니다. stackoverflow.com/) 질문 / 16798066 /… )
Holly Cummins

Java 9를 사용할 수 있기를 바랍니다. 우리는 과거에 살고 있습니다! :(
jDub9 2019

그 ... 좋지만 인수의 크기에 대한 몇 가지 제한이
라도슬라프 이바노프



2

다음은 사용할 수있는 작은 방법입니다.

  /**
   * 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 및 enum을 사용하여 수행하는 또 다른 방법은 다음과 같습니다.

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

EnumSet 참조 .

이 접근 방식과

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

5 개 이상의 요소가있는 경우 메서드의 javadoc은 Set.Of (E, E ...) 의 javadoc에서 볼 수 있듯이 성능 문제 일 수 있다고 명시합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.