web-dev-qa-db-ja.com

イテレータなしでSet/HashSetを反復する方法

以下のようなことなしにSet/HashSetを反復処理するにはどうすればいいですか?

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

enhanced forループを使うことができます

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

//populate set

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

またはJava 8の場合:

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

セットを反復処理する方法は少なくとも6つあります。次のことが私には知られています。

方法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");
78

あなたのセットを配列に変換する また、要素を反復処理するのに役立つかもしれない:

Object[] array = set.toArray();

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

説明するために、さまざまなPersonオブジェクトを保持する次のセットを考えます。

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. Forステートメントには、コレクションと配列を繰り返し処理するためのフォームがあります。このフォームは、拡張forステートメントとも呼ばれ、ループをよりコンパクトにして読みやすくするために使用できます。
for(Person p:people){
  System.out.println(p.getName());
}
  1. Java 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

あなたはよりきちんとしたコードのために機能的な操作を使うことができます

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

set.forEach((s) -> {
     System.out.println(s);
});
9
Samuel Moshie

Setを反復する方法についてのいくつかのヒントとそのパフォーマンスを次に示します。

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が最も時間がかかります。

9
Pritam Banerjee

列挙(?):

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());
    }

Java 8:

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

または

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