কোনও ইটেটর ছাড়াই কীভাবে একটি সেট / হ্যাশসেটের মাধ্যমে ইটারেট করবেন?


272

কীভাবে আমি বারবার একটি ওভার Set/ HashSetঅনুসরণ ছাড়া?

Iterator iter = set.iterator();
while (iter.hasNext()) {
    System.out.println(iter.next());
}

31
আপনি কি আসলে একজন পুনরুক্তি ব্যবহারকারীর ব্যবহার এড়াতে চেষ্টা করছেন, বা আপনি কেবল এটি আপনার উত্স কোডটিতে দেখতে চান না ?
জন স্কিটি

2
আপনি কোডটি খাটো এবং ক্লিনার করতে পারেন তবে আপনাকে একটি আইট্রেটর ব্যবহার করতে হবে। এমন কোনও কারণ আছে যা আপনি এড়াতে চান?
পিটার লরে

5
কেবল রেকর্ডের জন্য এবং কেন পুনরুক্তিকারীকে এড়াতে হবে তার ব্যাখ্যা হিসাবে: আমি বর্তমানে জাভাতে লেখা একটি অ্যান্ড্রয়েড গেমটিতে এই সমস্যার মুখোমুখি। এই মুহুর্তে শ্রোতাদের সঞ্চয় করার জন্য আমি একটি হ্যাশসেট ব্যবহার করছি যা নিয়মিতভাবে ইভেন্টগুলি সম্পর্কে অবহিত হওয়া প্রয়োজন। তবে, বারবার পুনরাবৃত্তি সংগ্রহের ফলে ভারী আবর্জনা সংগ্রহকারী ক্রিয়াকলাপ ঘটে যা গেম লুপকে বোঝা দিতে পারে। এবং এটি কোনও জাভা গেমটিতে যেতে হবে না। আমি এই অংশগুলি আবার লিখতে যাচ্ছি।
টিগুচি

12
@ থেকোশম্যান আমি কেবল জাভা গেম ডেভেলপমেন্টের দৃষ্টিকোণ থেকে কথা বলছি যেখানে আপনি নিয়মিত গেম স্টেট আপডেটের সময়ে সমস্ত মূল্যে জিসি এড়াতে চান। আইট্রেটারগুলি কেবলমাত্র অস্থায়ীভাবে দরকারী বস্তু যেহেতু আপনি এগুলি শুরুতে পুনরায় সেট করতে পারবেন না, সুতরাং তারা প্রতিটি পুনরাবৃত্তি পদ্ধতি কলটিতে পুনরায় তৈরি হয় (উদাহরণস্বরূপ অ্যারেলিস্ট.জভা উত্স দেখুন)। গেম লুপে দৃশ্যের অবজেক্টগুলি পুনরাবৃত্তি করার জন্য এবং প্রতি সেকেন্ডে কমপক্ষে 30 টি আপডেটের জন্য বিবেচনা করলে আপনি কমপক্ষে 60০ (দৃশ্যে সাধারণত চক্রের দ্বিগুণ পুনরুক্তি করা হয়) প্রতি সেকেন্ডে পুনরুদ্ধারের জন্য জিসিটির অপেক্ষায় থাকবেন ite এটি অ্যান্ড্রয়েডে একটি বড় প্রভাব ফেলে।
টিগুচি

9
সেক্ষেত্রে কারও একটি আরও পর্যাপ্ত ডেটা কাঠামো বাছাই করা উচিত? একটি সেট দক্ষতার সাথে পুনরাবৃত্তি করার জন্য ডিজাইন করা হয়নি। কেন একটি অ্যারেলিস্ট ব্যবহার করবেন না এবং লুপের জন্য একটি মান সহ এটিতে পুনরাবৃত্তি করবেন? কোনও অতিরিক্ত পুনরুক্তি তৈরি করা হয় নি, পড়ার অ্যাক্সেস খুব দ্রুত।
stef77

উত্তর:


491

আপনি লুপের জন্য একটি বর্ধিত ব্যবহার করতে পারেন :

Set<String> set = new HashSet<String>();

//populate set

for (String s : set) {
    System.out.println(s);
}

বা জাভা 8 সহ:

set.forEach(System.out::println);

65
আমি বিশ্বাস করি এটি পর্দার পিছনে একটি পুনরাবৃত্তি ব্যবহার করে।
munyengm

22
@ মুনিয়েনজিএম হ্যাঁ এটি করে।
পুনরূদ্ধারের

1
এটি কাজ করে, তবে এটি যদি সমস্যা দেয় তবে তা আমার পক্ষে সমাধান নয়। আমার ধারণা আমার কোনও পছন্দ নেই, আমাকে অবশ্যই আইট্রেটর ব্যবহার করতে হবে। যাইহোক সব জন্য ধন্যবাদ।
ব্যবহারকারী 1621988

39
@ user1621988 কি সমস্যা? আমার দেওয়া কোডটি নিয়ে কোনও সমস্যা নেই। এটি কেবল কোনও পুনরুক্তি ব্যবহারকারীর স্পষ্টভাবে ব্যবহার না করে কোনও সেটকে পুনরাবৃত্তি করার একটি দুর্দান্ত এবং পরিষ্কার উপায় সরবরাহ করে।
Assylias

90

কোনও সেটকে পুনরুক্ত করার জন্য কমপক্ষে ছয়টি অতিরিক্ত উপায় রয়েছে। নিম্নলিখিতগুলি আমার জানা:

পদ্ধতি 1

// Obsolete Collection
Enumeration e = new Vector(movies).elements();
while (e.hasMoreElements()) {
  System.out.println(e.nextElement());
}

পদ্ধতি 2

for (String movie : movies) {
  System.out.println(movie);
}

পদ্ধতি 3

String[] movieArray = movies.toArray(new String[movies.size()]);
for (int i = 0; i < movieArray.length; i++) {
  System.out.println(movieArray[i]);
}

পদ্ধতি 4

// Supported in Java 8 and above
movies.stream().forEach((movie) -> {
  System.out.println(movie);
});

পদ্ধতি 5

// Supported in Java 8 and above
movies.stream().forEach(movie -> System.out.println(movie));

পদ্ধতি 6

// Supported in Java 8 and above
movies.stream().forEach(System.out::println);

এটিই HashSetআমি আমার উদাহরণগুলির জন্য ব্যবহার করেছি:

Set<String> movies = new HashSet<>();
movies.add("Avatar");
movies.add("The Lord of the Rings");
movies.add("Titanic");

10
হাই 4 বেনি-নিউজবাউয়ার পদ্ধতি 4 , পদ্ধতি 5 , পদ্ধতি 6 এর জন্য আপনি কেবল অপ্রয়োজনীয় অপসারণ করতে পারেন stream()
ইউজিন টি

5
মেথড 4, পদ্ধতি 5 এবং পদ্ধতি 6 এক হিসাবে উল্লেখ করার দরকার নেই।
গুস্তাভো সিনিক

24

আপনার সেটটিকে একটি অ্যারেতে রূপান্তর করা আপনাকে উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করতে সহায়তা করতে পারে:

Object[] array = set.toArray();

for(int i=0; i<array.length; i++)
   Object o = array[i];

45
কেবল রেকর্ডের জন্য, toArrayসেটটির পুনরাবৃত্তিকে কল করে।
Assylias

13

প্রদর্শনের জন্য, নিম্নলিখিত সেটটি বিবেচনা করুন, যা বিভিন্ন ব্যক্তি বস্তু ধারণ করে:

Set<Person> people = new HashSet<Person>();
people.add(new Person("Tharindu", 10));
people.add(new Person("Martin", 20));
people.add(new Person("Fowler", 30));

ব্যক্তি মডেল ক্লাস

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //TODO - getters,setters ,overridden toString & compareTo methods

}
  1. বিবৃতিটির জন্য সংগ্রহ এবং অ্যারেগুলির মাধ্যমে পুনরাবৃত্তির জন্য নকশাকৃত একটি ফর্ম রয়েছে। এই ফর্মটি কখনও কখনও বিবৃতিটির জন্য বর্ধিত হিসাবে চিহ্নিত হয় এবং আপনার লুপগুলি আরও কমপ্যাক্ট এবং সহজেই পড়তে সহজ হয় make
for(Person p:people){
  System.out.println(p.getName());
}
  1. জাভা 8 - java.lang.Iterable.forEach (গ্রাহক)
people.forEach(p -> System.out.println(p.getName()));
default void forEach(Consumer<? super T> action)

Performs the given action for each element of the Iterable until all elements have been processed or the action throws an exception. Unless otherwise specified by the implementing class, actions are performed in the order of iteration (if an iteration order is specified). Exceptions thrown by the action are relayed to the caller. Implementation Requirements:

The default implementation behaves as if: 

for (T t : this)
     action.accept(t);

Parameters: action - The action to be performed for each element

Throws: NullPointerException - if the specified action is null

Since: 1.8


11

সেটের পারফরম্যান্সের সাথে কীভাবে কোনও সেট পুনরাবৃত্তি করবেন সে সম্পর্কে এখানে কয়েকটি টিপস রয়েছে:

public class IterateSet {

    public static void main(String[] args) {

        //example Set
        Set<String> set = new HashSet<>();

        set.add("Jack");
        set.add("John");
        set.add("Joe");
        set.add("Josh");

        long startTime = System.nanoTime();
        long endTime = System.nanoTime();

        //using iterator
        System.out.println("Using Iterator");
        startTime = System.nanoTime();
        Iterator<String> setIterator = set.iterator();
        while(setIterator.hasNext()){
            System.out.println(setIterator.next());
        }
        endTime = System.nanoTime();
        long durationIterator = (endTime - startTime);


        //using lambda
        System.out.println("Using Lambda");
        startTime = System.nanoTime();
        set.forEach((s) -> System.out.println(s));
        endTime = System.nanoTime();
        long durationLambda = (endTime - startTime);


        //using Stream API
        System.out.println("Using Stream API");
        startTime = System.nanoTime();
        set.stream().forEach((s) -> System.out.println(s));
        endTime = System.nanoTime();
        long durationStreamAPI = (endTime - startTime);


        //using Split Iterator (not recommended)
        System.out.println("Using Split Iterator");
        startTime = System.nanoTime();
        Spliterator<String> splitIterator = set.spliterator();
        splitIterator.forEachRemaining((s) -> System.out.println(s));
        endTime = System.nanoTime();
        long durationSplitIterator = (endTime - startTime);


        //time calculations
        System.out.println("Iterator Duration:" + durationIterator);
        System.out.println("Lamda Duration:" + durationLambda);
        System.out.println("Stream API:" + durationStreamAPI);
        System.out.println("Split Iterator:"+ durationSplitIterator);
    }
}

কোডটি স্ব-বর্ণনামূলক।

সময়সীমা ফলাফল:

Iterator Duration: 495287
Lambda Duration: 50207470
Stream Api:       2427392
Split Iterator:    567294

আমরা দেখতে পাচ্ছি যে সবচেয়ে দ্রুততম Lambdaসময়টি সবচেয়ে বেশি সময় নেয় Iterator


2

এনুমারেশন (?):

Enumeration e = new Vector(set).elements();
while (e.hasMoreElements())
    {
        System.out.println(e.nextElement());
    }

আর একটি উপায় (java.util. Collections.enumeration ()):

for (Enumeration e1 = Collections.enumeration(set); e1.hasMoreElements();)
    {
        System.out.println(e1.nextElement());
    }

জাভা 8:

set.forEach(element -> System.out.println(element));

অথবা

set.stream().forEach((elem) -> {
    System.out.println(elem);
});

0

তবে এর জন্য ইতিমধ্যে খুব ভাল উত্তর পাওয়া যায়। আমার উত্তর এখানে:

1. set.stream().forEach(System.out::println); // It simply uses stream to display set values
2. set.forEach(System.out::println); // It uses Enhanced forEach to display set values

এছাড়াও, যদি এই সেটটি কাস্টম শ্রেণীর ধরণের হয়, যেমন: গ্রাহক।

Set<Customer> setCust = new HashSet<>();
    Customer c1 = new Customer(1, "Hena", 20);
    Customer c2 = new Customer(2, "Meena", 24);
    Customer c3 = new Customer(3, "Rahul", 30);

setCust.add(c1);
setCust.add(c2);
setCust.add(c3);
    setCust.forEach((k) -> System.out.println(k.getId()+" "+k.getName()+" "+k.getAge()));

// গ্রাহক শ্রেণি:

class Customer{
private int id;
private String name;
private int age;

public Customer(int id,String name,int age){
this.id=id;
this.name=name;
this.age=age;
} // Getter, Setter methods are present.}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.