.AsSet (…) কোনও এপিআই-তে বিদ্যমান?


108

আমি একটি সেট তৈরি করার খুব সহজ উপায় খুঁজছি।

Arrays.asList("a", "b" ...) সৃষ্টি করে a List<String>

এর মতো কিছু আছে কি Set?



1
এটি নয়, একটি সেট তৈরি করা এবং একটি
অ্যারেকে

উত্তর:


84

এখন জাভা 8 এর সাহায্যে আপনি তৃতীয় পক্ষের কাঠামোর প্রয়োজন ছাড়াই এটি করতে পারেন:

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

সংগ্রহকারী দেখুন ।

উপভোগ করুন!


4
আজকাল জাভা 8 এর সাথে এটি সম্ভবত সেরা উত্তর কারণ এটি তৃতীয় পক্ষের গ্রন্থাগারগুলির উপর নির্ভর করে না এবং সহজেই অন্যান্য সংগ্রহের ধরণগুলির সাথে মানিয়ে নেওয়া যায়, তাই আমি এটি গ্রহণযোগ্য হিসাবে সেট করছি। অন্যান্য দুর্দান্ত সমাধানের জন্য সবাইকে অনেক ধন্যবাদ। (
বিটিডব্লিউ

3
এখন, কে বলেছিল যে জাভা খুব ভার্বোস ছিল? অবশ্যই এটি সেরা উত্তর!
ববডুলিটল

অনেক ধন্যবাদ @ بابডুলিটল!
মিঃ অ্যান্ডারসন

2
জাভা 9+ ব্যবহার করা যে কোনও ব্যক্তির জন্য দয়া করে নীচে হোলির জবাবটি দেখুন: stackoverflow.com/a/48025159/229743
টেলর

1
নির্দোষ জবাব মিঃ অ্যান্ডারসন!
গৌরব

63

পেয়ারা ব্যবহার করে , এটি এতটা সহজ:

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

বা একটি পরিবর্তনীয় সেট জন্য:

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

আরও ডেটা ধরণের জন্য পেয়ারা ব্যবহারকারী গাইড দেখুন


এটির অ-পরিবর্তনীয় সংস্করণ কি আছে?
কেহান

3
@ কেহেন হ্যাঁ: Sets.newHashSet("a", "b")বাSets.newLinkedHashSet("a", "b")
সান প্যাট্রিক ফ্লয়েড

1
আমি উত্তরে একটি পরিবর্তনীয় রূপটি যুক্ত করেছি।
মাইকেল শ্মিয়ের

আসলে, Sets.newLinkedHashSet()সেই স্বাক্ষরের সাথে অস্তিত্ব নেই, দুঃখিত
সান প্যাট্রিক ফ্লয়েড

আমি প্রকারের একটি আর্গুমেন্ট মুছে ফেলতে সক্ষম হয়েছি:Set<String> mySet = ImmutableSet.of("a", "b");
জোশডেন


24

শূন্য বা এক সদস্যের সাথে সেটগুলির বিশেষ ক্ষেত্রে আপনি ব্যবহার করতে পারেন:

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.
3'18 এডিট

17

অন্যরা যেমন বলেছে, ব্যবহার করুন:

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

জাভাতে এটির অস্তিত্ব না থাকার কারণটি হ'ল 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অভ্যন্তরে কোনও "স্থির আকারের" জেডিকে প্রয়োগ নেই Arrays। আপনি এটি কেন চান? একটি Setগ্যারান্টি দেয় যে এখানে কোনও সদৃশ নেই, তবে আপনি যদি এগুলি হাত দ্বারা টাইপ করে থাকেন তবে আপনার সেই কার্যকারিতাটির দরকার নেই ... এবং Listআরও পদ্ধতি রয়েছে। উভয় ইন্টারফেস প্রসারিত Collectionএবং Iterable


অন্যরা যেমন বলেছে, পেয়ারা ব্যবহার করুন যদি আপনি সত্যিই এই কার্যকারিতাটি চান - কারণ এটি জেডিকে নয়। এ সম্পর্কিত তথ্যের জন্য তাদের উত্তরগুলি দেখুন (বিশেষত মাইকেল শ্মিয়েরের উত্তর)।


3
এটি এখন পর্যন্ত সেরা উত্তর, কারণ এটি অ্যারি.এএসলিস্ট () আসলে কী করে তা নির্দেশ করে। অনেক দেবতারা বিশ্বাস করে যে অ্যারে.এএসলিস্ট () একটি জাভা.ইটিল.আরলিলিস্ট তৈরি করে, যখন এটি আসলে একটি জাভা.ইটিল.আররেইস $ অ্যারেলিস্ট তৈরি করে (যা কেবলমাত্র আংশিকভাবে পরিবর্তনযোগ্য এবং অন্তর্নিহিত অ্যারের সরাসরি দৃশ্য)
শন প্যাট্রিক ফ্লয়েড

1
কেউ কেন এটি করতে চান তা হিসাবে, হাত দ্বারা একটি সেট (বা তালিকা) তৈরির সর্বাধিক সাধারণ কারণটি আপনি একটি পরীক্ষার শ্রেণিতে যেখানে আপনি পরীক্ষার মানগুলিতে পাস করছেন।
স্কট ম্যাকআইন্টির

14

জাভা 9 এ, কারখানা পদ্ধতিগুলির মাধ্যমে অনুরূপ ফাংশন যুক্ত করা হয়েছে:

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

( Listপাশাপাশি সমতা আছে ।)


আমি এটি চেষ্টা করেছি এবং একটি সংকলক সতর্কতা পেয়েছি যে এটি কোনও এপিআই পদ্ধতি নয়।
ফিলিপ জিওসিফি

এখানে প্রাসঙ্গিক জাভা ডক: docs.oracle.com/javase/9/docs/api/java/util/Set.html । জাভা 9+ জেডিকে ব্যবহারের পাশাপাশি জাভা 9 কমপ্লায়েন্সটি ব্যবহার করার জন্য আপনাকে নিজের আইডিই বা বিল্ডিং সরঞ্জামের প্রয়োজন হতে পারে (উদাহরণস্বরূপ, মেভেনের জন্য, এটি এখানকারদের সাথে একই ধরণের পদক্ষেপ হতে পারে তবে সেট করুন 1.9: stackoverflow.com/ প্রশ্নগুলি / 16798066 /… )
হোলি কামিন্স

আমরা যদি জাভা 9 ব্যবহার করতে পারি তবে আমরা অতীতে বাস করছি! :(
jDub9

এটি ভাল তবে আর্গুমেন্টের আকারের উপর কিছুটা বিধিনিষেধ রয়েছে ...
রেডোস্লাভ ইভানভ



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

জাভা 8 এবং এনামগুলি ব্যবহার করে এটি করার আর একটি উপায় হ'ল:

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

এনামসেট দেখুন ।

আমি এই পদ্ধতির এবং এর মধ্যে পারফরম্যান্স বিশ্লেষণের প্রস্তাব দেব

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

কারণ যদি আপনার পাঁচটিরও বেশি উপাদান থাকে তবে পদ্ধতির জাভাদোকটি জানায় যে সেট.ওএফ (ই, ই ...) এর জাভাদকটিতে আপনি দেখতে পাচ্ছেন পারফরম্যান্সের সমস্যা ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.