.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더 많은 메서드가 있습니다. 두 인터페이스 모두 확장 Collection및 Iterable.


다른 사람들이 말했듯이, 이 기능을 정말로 원한다면 구아바를 사용하십시오 -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.