Java

コレクションを拡張する

for文で取得する

for文は理解している方が多いと思います。C言語など様々な言語で要素を順に取り出していく時よく使われる手法です。

for(int i=0; i < リスト変数.size(); i++){
/*リスト変数.get(i)を用いた処理*/
}
コード例
ArrayList<String> names = new ArrayList<>();

//ArrayListに値を追加。。。

for(int i=0; i<names.size(); i++){
    System.out.println(names.get(i));
}

拡張for文で取得する

for(リスト要素の型 e: リスト変数){
/*要素eを用いた処理*/
}
コード例
ArrayList<String> names = new ArrayList<>(); 

//ArrayListに値を追加。。。

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

 

イテレータで取得する

javaでは、ある〜型の変数を指すものをjava.util.iterator<〜>のインスタンスで扱います。そしてこのインスタンスはnew演算子を使いません。そのかわりにリスト変数自体のiterator()メソッドを呼び出すことで、変数の先頭をさしたイテレータのインスタンスを得ることができます。

Iterator<リストの要素の型> i = リスト変数.iterator();
while(i.hasNext){
    リスト要素の型 e = i.next();
    /*要素eを用いた処理*/
}
イテレータインスタンスが持っているメソッド
戻り値 メソッド 意味
boolean hasNext() 次の要素を指せる場合はTrueを返す
~ next() 次の要素を指してその内容を返す
コード例
import java.util.*;

public class Main{
    public static void main(String[] args){
    ArrayList<String> names = new ArrayList<>();
    names.add("hoge");
    names.add("huga");
    names.add("foo");

    Iterator<String> i = names.iterator();
        while(i.hasNext()){
            String e = i.next;
            System.out.println(e);
        }
    }
}

必ずしもiterator()メソッドが使えるわけではありません。
使える条件としては、Iterableインターフェースが実装される必要があります。ちなみにArrayListなどのコレクションは、Iterableインターフェースが実装されているために、Iterableインターフェースを実装する必要がありません。

詳しくしりたい方はこちらをご覧ください

Iterableインターフェースを実装してクラスを作る
class MyArray implements Iterable<String> {
    private String[] v = new String[10];
    private int ptr = 0;

    public void add(String t) { v[ptr++] = t;}
    public String get(int i) { String a = v[i]; return a;}
    public int getSize() { return ptr;}
    public Iterator<String> iterator() { return new MyIterator();}

        private class MyIterator implements Iterator<String> {
            int idx;
            // Constructor
            public MyIterator() {idx = 0;}

            public boolean hasNext() { return idx < ptr ;}
            public String next() { 
            if(idx >= ptr){throw new java.util.NoSuchElementException();}
        
            String element = v[idx]; idx++;
            return element;
            }

           public void remove() {/* we think there will not be remove invocation.*/}
    } // end of MyIterator
}// end of MyArray

public class IteratorExample {
    public static void main(String[] args) {
        MyArray str = new MyArray();
        str.add("This");
        str.add("is");
        str.add("a");
        str.add("test");
        str.add("string.");
       
        for(String s : str) System.out.print(s + " ");
        System.out.println();
    }
}

ComparableインターフェースとComparator

iterableインターフェースと同様にComparebleインターフェースを実装することにより、その継承したクラスはソートが可能になります。

Comparator

コード例
class SortableMen implements Comparable<SortableMen> {
    private String name;
    private Integer age;

    public SortableMen (String n, Integer a){ name = n; age = a; }
    public String getName() { return name; }
    public Integer getAge() { return age; }
    public String toString() { return new 
            StringBuffer(128).append("Name: ").append(name).append(", Age: ").append(age.toString()).toString();
    }
    public void setName(String n) { name = n; }
    public void setAge(Integer a) { age = a; }

    public int compareTo(SortableMen v){
        int result;
        result = name.compareTo(v.getName()); 
        return result == 0 ? age.compareTo(v.getAge()) : result ;
    }
}

import java.util.Arrays;
public class TryMenSort {
    public static void main(String[] args) {
        SortableMen[] srtm = {
            new SortableMen("Man D",25),
            new SortableMen("Man A",25),
            new SortableMen("Man A",30),
            new SortableMen("Man B",25)};
 
    System.out.println("Original Order: ");
    for (SortableMen m : srtm) System.out.println(m);
    Arrays.sort(srtm);
    System.out.println("¥nOrder after sorting using Comparable method: ");
    for (SortableMen m : srtm) System.out.println(m);
}}