このエントリーをはてなブックマークに追加

Collectパッケージ

よく使うパッケージです。配列とかに関して

インターフェース

マルチマップとは、複数の値を1つのキーで所持できます。

クラス

カテゴリー 分類されるクラス
Guavaデータクラス Table・Multiset・Multimap・BiMapの実装クラス
木構造 TreeTraverser・BinaryTreeTraverser
ユーティリティー Collections2・Interners・Lists
フォワーディング系 Fowarding系クラス
イミュータブル系 Immutable系クラス
その他 当てはらないクラス

Guavaデータクラス

ArrayListMultimap

ArrayListを使ったマルチマップ collect.MapConstraints - Mapに値がputされた時、チェックできるようにします。

ConcurrentHashMultiset

コンカレントなHashマルチセット

ユーティリティー

Collections2

Collectionのユーティリティー (java.util.Collectionsがあるので、Collections2)

Interners

String.intern()のようなことをするInternerのユーティリティー

newStrongInternerの中身

  public static <E> Interner<E> newStrongInterner() {
    final ConcurrentMap<E, E> map = new MapMaker().makeMap();
    return new Interner<E>() {
      @Override public E intern(E sample) {
        E canonical = map.putIfAbsent(checkNotNull(sample), sample);
        return (canonical == null) ? sample : canonical;
      }
    };
  }

newWeakInternerというGWT未対応というメソッドもある

MapConstrains

MapConstrainのためのユーティリティー

MapConstrainはマップのキーと値が正しいかどうかを、調べるためのinterface

 public void checkKeyValue(Object key, Object value) {
     if (key == null || value == null) {
       throw new NullPointerException();
     }
   }

ObjectArrays

配列を操作、引数がClassのものはGWT未対応 追加するconcatなどがある

木構造

データーを簡単に指定の順番(行きがけ順、通りがけ順、帰りがけ順)で探索(トラバース)する
abstractを実装するだけで、Iterableが返ってくる。

BinaryTreeTraverser

バイナリツリー二分木用 leftChild(T root)・rightChild(T root)を実装する

TreeTraverser

普通のツリー構造用

children(T root)を実装する

当てはらないクラスの解説

AbstractIterator

簡単にIteratorを拡張可能

nullをskipする例 via JavaDoc

public static Iterator<String> skipNulls(final Iterator<String> in) {
     return new AbstractIterator<String>() {
       protected String computeNext() {
         while (in.hasNext()) {
           String s = in.next();
           if (s != null) {
             return s;
           }
         }
         return endOfData();
       }
     };
   }

AbstractSequentialIterator

プログラムで制御する前回の値を元に次の値を返すIteratorを作成可能
nullを返すと終了

一定値まで延々と値を2倍していく via JavaDoc

   Iterator<Integer> powersOfTwo = 
       new AbstractSequentialIterator<Integer>(1) {
         protected Integer computeNext(Integer previous) {
           return (previous == 1 << 30) ? null : previous * 2;
         }
       };

ComparisonChain

比較を簡単に作れる。

他の手軽に作れる系だと、Objects.ToStringHelperがある。

例 via javadoc

 public int compareTo(Foo that) {
     return ComparisonChain.start()
         .compare(this.aString, that.aString)
         .compare(this.anInt, that.anInt)
         .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast())
         .result();
   }

ContiguousSet

範囲の値を網羅したSetを返す

Range<Integer> nums=Range.closed(1, 10);
        ContiguousSet<Integer> numSets=ContiguousSet.create(nums, DiscreteDomain.integers());
        LogUtils.log(Joiner.on(",").join(numSets));//return 1,2,3,4,5,6,7,8,9,10

DiscreteDomain

ContiguousSetで使う、指定値の前後の値を返す

4096色を表示する例

    public class WebColorDiscreteDomain extends DiscreteDomain<String>{

        @Override
        public String next(String value) {
            checkArgument(isColorHex(value));
            int color=toColor(value);
            if(color<0xfff){
                color++;
            }else{
                return null;
            }

            int[] rgb=colorToRGB(color);

            String hex=rgbToString(rgb);
            return hex;
        }

        @Override
        public String previous(String value) {
            checkArgument(isColorHex(value));

            int color=toColor(value);
            if(color>0){
                color--;
            }else{
                return null;
            }

            int[] rgb=colorToRGB(color);

            return rgbToString(rgb);
        }

        @Override
        public long distance(String start, String end) {
            checkArgument(isColorHex(start) && isColorHex(end));
            int[] startRGB=toRGB(start);
            int[] endRGB=toRGB(end);

            //somehow end minus start
            return  (endRGB[0]<<8 & endRGB[1]<<4 & endRGB[2]) - (startRGB[0]<<8 & startRGB[1]<<4 & startRGB[2]);
        }

        public boolean isColorHex(String value){
            return value.length()==4 && value.startsWith("#") && CharMatcher.JAVA_DIGIT.or(CharMatcher.inRange('A', 'F')).matchesAllOf(value.toUpperCase().substring(1));
        }

        private int[] colorToRGB(int color){
            int[]rgb=new int[3];
            rgb[0]=color>>8&0xf;
            rgb[1]=color>>4 &0xf;
            rgb[2]=color & 0xf;
            return rgb;
        }
        private int toColor(String value){
            return Integer.parseInt(value.substring(1), 16);
        }

        private int[] toRGB(String value){
            int[] rgb=new int[3];
            rgb[0]=Integer.parseInt(value.substring(1,2), 16);
            rgb[1]=Integer.parseInt(value.substring(2,3), 16);
            rgb[2]=Integer.parseInt(value.substring(3,4), 16);
            return rgb;
        }




        //return #FFF Upper-case

        private String rgbToString(int[] rgb){
            String hex= new StringBuilder().append("#")
            .append(Integer.toHexString(rgb[0]))
            .append(Integer.toHexString(rgb[1]))
            .append(Integer.toHexString(rgb[2])).toString().toUpperCase();
            LogUtils.log(hex);
            return hex;
        }

    }

FluentIterable - collect.FluentIterableを参照

Iterable操作の集大成

MapMaker

コンカレントマップを作る

GWTで使用する時

moduleに以下行を追加

<inherits name="com.google.common.collect.Collect"/>