জাভাতে একটি তালিকাতে কোনও তালিকা রূপান্তরিত করার সহজ উপায়


627

সবচেয়ে সহজ উপায় একটি রূপান্তর করতে কি Listএকটি থেকে Setজাভা?

উত্তর:


1065
Set<Foo> foo = new HashSet<Foo>(myList);

3
সঠিক করার সময় এই উত্তরের সর্বোত্তম / গ্রহণযোগ্য উত্তর হবার পক্ষে পর্যাপ্ত প্রযুক্তিগত প্রসঙ্গের অভাব রয়েছে, কারণ কোনটি বাস্তবায়ন Setএবং Mapকোনটি ব্যবহার করছে তার উপর নির্ভর করে এখানে বিপদগুলি রয়েছে ; HashSetএখানে ধরে নেওয়া হয়।
ম্যাডব্রেকস

145

আমি sepp2k এর সাথে একমত, তবে কিছু অন্যান্য বিবরণ রয়েছে যা বিবেচনা করতে পারে:

new HashSet<Foo>(myList);

আপনাকে একটি অমীমাংসিত সেট দেবে যার সদৃশ নেই। এই ক্ষেত্রে, আপনার বস্তুগুলিতে .equals () পদ্ধতি ব্যবহার করে সদৃশ চিহ্নিত করা হয়। এটি .hashCode () পদ্ধতির সাথে একত্রে করা হয়। (সমতা বর্ণন সম্পর্কে আরো জানার জন্য এখানে )

বাছাই করা সেট দেয় এমন বিকল্প হ'ল:

new TreeSet<Foo>(myList);

Foo তুলনীয় কার্যকর করে যদি এটি কাজ করে। যদি তা না হয় তবে আপনি তুলনামূলক ব্যবহার করতে চাইতে পারেন:

Set<Foo> lSet = new TreeSet<Foo>(someComparator);
lSet.addAll(myList);

স্বতন্ত্রতা নিশ্চিত করতে এটি তুলনামূলকভাবে () তুলনামূলক ইন্টারফেস থেকে) বা তুলনা () তুলনায় (উপরের উপর নির্ভর করে) depends সুতরাং, যদি আপনি কেবল স্বাতন্ত্র্য সম্পর্কে চিন্তা করেন তবে হ্যাশসেটটি ব্যবহার করুন। আপনি যদি বাছাইয়ের পরে থাকেন, তবে ট্রিসেটটি বিবেচনা করুন। (মনে রাখবেন: পরে অপ্টিমাইজ করুন!) সময়ের দক্ষতার ক্ষেত্রে যদি স্থান কার্যক্ষমতা বিবেচনায় একটি হ্যাশসেট ব্যবহার করে, ট্রিসেটটি দেখুন। নোট করুন যে সেট এবং মানচিত্রের আরও কার্যকর প্রয়োগগুলি ট্রভের (এবং অন্যান্য অবস্থানের) মাধ্যমে উপলব্ধ।


কাস্টম তুলনামূলক ব্যবহারের ক্ষেত্রে অন্তর্ভুক্ত করার জন্য ধন্যবাদ!
জাস্টিন পেপেজ

70

আপনি যদি পেয়ারা গ্রন্থাগার ব্যবহার করেন :

Set<Foo> set = Sets.newHashSet(list);

বা, আরও ভাল:

Set<Foo> set = ImmutableSet.copyOf(list);

2
কেন ইমিটবেটসেটকপি ভাল?
ব্যবহারকারী 672009

1
মূলত জাভা নতুন হ্যাশসেট () এর চেয়ে পেয়ার নতুন হ্যাশসেট () এর কী কী সুবিধা রয়েছে?
Nelda.techspiress

@ নেল্ডা.টেকস্পাইসর জাভাডোক আলোচনা করে যে কখন এই পদ্ধতিটি ব্যবহার করা উচিত বা না করা উচিত। চূড়ান্ত অংশটি নোট করুন: এই পদ্ধতিটি খুব কার্যকর নয় এবং ভবিষ্যতে সম্ভবত হ্রাস করা হবে। যদিও আমি খানিকটা আশ্চর্য্য ধারাবাহিকতাটিকে একটি ফ্যাক্টর হিসাবে উল্লেখ করা হয় নি, যেমন এটি রয়েছে ImmutableSet.of(), উদাহরণস্বরূপ। সম্পাদনা: এটি ফ্যাক্টর নাও হতে পারে কারণ সমস্ত ওভারলোডগুলি অনিবদ্ধ।
shmosel

1
আরে @ শমোসেল রেফারেন্সের জন্য ধন্যবাদ, তবে আমি অনুগত জ্ঞানের জন্য আরও সন্ধান করছিলাম। যারা পেয়ারা ব্যবহার করেছেন তাদের জন্য কেন পেয়ারা হ্যাশসেটের উপরে বেছে নেওয়া হবে?
Nelda.techspiress

27

জাভা 8 ব্যবহার করে আপনি স্ট্রিম ব্যবহার করতে পারেন:

List<Integer> mylist = Arrays.asList(100, 101, 102);
Set<Integer> myset = mylist.stream().collect(Collectors.toSet()));

10
আপনি কি এর উপর পারফরম্যান্স পেনাল্টি পরীক্ষা করেছেন? এটি একটি পুনরাবৃত্ত + পুনরুক্তিকারী, একটি নতুন হ্যাশসেট () করবে এবং তারপরে প্রতিটি তালিকার আইটেমের জন্য নতুন সেটটিতে একটি অ্যাডএল () কল করবে। সামগ্রিকভাবে, সিসিএ। একটি নতুন হ্যাশসেট (তালিকা) হিসাবে সাধারণ কোনও কিছুর জন্য 5 টি অবজেক্ট তৈরি করা হয়েছে।
আগস্টন হরভাথ

1
@ অ্যাগস্টনহোরভাথ আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ। আমি এখানে আসার সময় আমি মূলত সেই তথ্যটি খুঁজছিলাম।
TheRealChx101

17
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
সম্পূর্ণ কোড উদাহরণের জন্য +1। এখানে একটি অতিরিক্ত নোট হ'ল রান করা থেকে রান করার জন্য হ্যাশিংয়ের সমান গ্যারান্টিযুক্ত নয়। তার মানে হল যে 'সেট মানগুলি .....' এর পরে মুদ্রিত তালিকাটি হতে পারে 'এবিসি' এক রান এবং 'সিবিএ' অন্য রান। আমি আমার উত্তরে যেমন উল্লেখ করেছি, আপনি স্থির ক্রম পেতে কোনও ট্রি সেট ব্যবহার করতে পারেন। আরেকটি বিকল্প হ'ল একটি লিংকডহ্যাশসেট ব্যবহার করা হবে যা আইটেমগুলিতে যুক্ত হওয়ার আদেশটি মনে রাখে।
স্পিনা

8

আমি সেট এ রূপান্তর করার আগে একটি নাল চেক সঞ্চালন করব।

if(myList != null){
Set<Foo> foo = new HashSet<Foo>(myList);
}

3
বাSet<Foo> foo = myList == null ? Collections.emptySet() : new HashSet<Foo>(myList);
vegemite4me

6

আপনি রূপান্তর 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);
}

আমি মনে করি আপনি তালিকা থেকে সেট এটিকে কাস্টিং করতে চেয়েছিলেন।
সাইমন


6

জাভা - অ্যাডএল

set.addAll(aList);

জাভা - নতুন অবজেক্ট

new HashSet(list)

জাভা-8

list.stream().collect(Collectors.toSet());

গুভা ব্যবহার করা

 Sets.newHashSet(list)

অ্যাপাচি কমন্স

CollectionUtils.addAll(targetSet, sourceList);

জাভা 10

var set = Set.copyOf(list);

5

আসুন আমাদের তুলনামূলকভাবে নতুন বন্ধুটি ভুলে যাবেন না, স্ট্রিম এপিআই। যদি সেটটিকে কোনও সেটে রূপান্তর করার আগে আপনার প্রিপ্রোসেসের প্রয়োজন হয় তবে এর মতো কিছু থাকা ভাল:

list.stream().<here goes some preprocessing>.collect(Collectors.toSet());

4

কনস্ট্রাক্টর ব্যবহারের সেরা উপায়

Set s= new HashSet(list);

জাভা 8-তে আপনি এপিআই স্ট্রিমও ব্যবহার করতে পারেন:

Set s= list.stream().collect(Collectors.toSet());

3

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) পেতে অন্য বিকল্পটি ব্যবহার করতে পারি ।


3

জাভা 10 এর সাহায্যে আপনি এখন Set#copyOfসহজেই List<E>একটিকে অবিরাম পরিবর্তনযোগ্য রূপান্তর করতে ব্যবহার করতে পারেন Set<E>:

উদাহরণ:

var set = Set.copyOf(list);

মনে রাখবেন যে এটি একটি আনর্ডারড অপারেশন এবং is null উপাদান না অনুমোদিত যেমন একটি নিক্ষেপ করা হবে NullPointerException

যদি আপনি এটি পরিবর্তনযোগ্য হতে চান, তবে কেবল এটি নির্মাণকারীর কাছে একটি Setবাস্তবায়ন করুন।


2

এর সাথে আরও একটি জাভা 8 রোধক সমাধান Optional.ofNullable

Set<Foo> mySet = Optional.ofNullable(myList).map(HashSet::new).orElse(null);

2

আপনি যদি গ্রহগ্রহের সংগ্রহগুলি ব্যবহার করেন :

MutableSet<Integer> mSet = Lists.mutable.with(1, 2, 3).toSet();
MutableIntSet mIntSet = IntLists.mutable.with(1, 2, 3).toSet();

MutableSetইন্টারফেস প্রসারিত java.util.Setযেহেতু MutableIntSetইন্টারফেস না। আপনি যে কোনো রূপান্তর করতে পারেন Iterableএকটি থেকে Setব্যবহার Setsকারখানা বর্গ।

Set<Integer> set = Sets.mutable.withAll(List.of(1, 2, 3));

সেখানে অন্ধকার সংগ্রহগুলি পাওয়া চপল কারখানার আরও ব্যাখ্যা এখানে

আপনি যদি একটি ImmutableSetথেকে একটি চান List, আপনি Setsনিম্নরূপে কারখানাটি ব্যবহার করতে পারেন :

ImmutableSet<Integer> immutableSet = Sets.immutable.withAll(List.of(1, 2, 3))

দ্রষ্টব্য: আমি গ্রহগ্রাহ সংগ্রহের প্রতিশ্রুতিবদ্ধ


0

মনে রাখবেন, তালিকা থেকে সেট থেকে রূপান্তরকরণ সংগ্রহ থেকে সদৃশগুলি মুছে ফেলবে কারণ তালিকার সদৃশগুলি সমর্থন করে তবে সেট জাভাতে সদৃশকে সমর্থন করে না।

ডাইরেক্ট রূপান্তর: তালিকায় একটি সেটকে রূপান্তর করার সর্বাধিক সাধারণ এবং সহজ উপায়

// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");

// Converting a list to set
Set<String> set = new HashSet<>(list);

অ্যাপাচি কমন্স সংগ্রহ: আপনি কোনও তালিকা কোনও সেটে রূপান্তর করতে কমন্স সংগ্রহগুলি এপিআইও ব্যবহার করতে পারেন: -

// Creating a list of strings
List<String> list = Arrays.asList("One", "Two", "Three", "Four");

// Creating a set with the same number of members in the list 
Set<String> set = new HashSet<>(4);

// Adds all of the elements in the list to the target set
CollectionUtils.addAll(set, list);

স্ট্রিম ব্যবহার করে: অন্য উপায় হল প্রদত্ত তালিকাটিকে স্ট্রিমে রূপান্তর করা, তারপরে সেট করে স্ট্রিম করুন: -

// Creating a list of strings 
List<String> list = Arrays.asList("One", "Two", "Three", "Four"); 

// Converting to set using stream 
Set<String> set = list.stream().collect(Collectors.toSet()); 
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.