[java]SortedMapでも試してみた

Map<String, String> map = new LinkedHashMap<String, String>();

SortedMap<String, String> map = new TreeMap<String, String>();

に変えてみても、やはり拡張forの方が高速。

拡張for: 6078(ms)
while: 6235(ms)

Map使う場合は拡張forの方が効率が良いみたいですね。
ちなみに Java6 update2 でコンパイル、実行を行ってます。

[java]拡張for と while の比較

10000要素を持つマップオブジェクトを1000回参照すると、0.1秒くらい差が出ました。

拡張for: 2156(ms)
while: 2250(ms)

なんだ、拡張for速いじゃん。
Intel Core2 Duo 2.4GHz、メモリ2GB、WindowsXP SP2上にVMWareServerを起動。
VMWareServer上に構築したWindowXP SP2環境にて実施。

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

/**
 * マップに関するサンプルクラス
 * @author kazuki-kido
 */
public class MapSample {
    /**
     * マップ参照サンプル
     * @param args
     */
    public static void main(String[] args){
        Map<String, String> map = new LinkedHashMap<String, String>();
        // マップオブジェクトに値をセット
        for(int i=0; i<10000; i++){
            map.put(i + "回目", String.valueOf(i));
        }
        
        long start, end;
        StringBuilder temp;
                
        // 拡張for
        start = System.currentTimeMillis();
        for(int i=0; i<1000; i++){
            temp = new StringBuilder();
            for(String key : map.keySet()){
                temp.append(key).append(map.get(key));
            }
        }
        end = System.currentTimeMillis();
        System.out.println("拡張for: " + (end - start) + "(ms)");
        
        // while
        start = System.currentTimeMillis();
        for(int i=0; i<1000; i++){
            Set<String> set = map.keySet();
            Iterator<String> iterator = set.iterator();
            temp = new StringBuilder();
            while(iterator.hasNext()){
                String key = iterator.next();
                temp.append(key).append(map.get(key));
            }
        }
        end = System.currentTimeMillis();
        System.out.println("while: " + (end - start) + "(ms)");
    }
}

[java]Mapのキーと値を簡単に参照する方法

for(:) を使えばこんなに簡単〜

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * マップに関するサンプルクラス
 * @author kazuki-kido
 */
public class MapSample {
    /**
     * マップ参照サンプル
     * @param args
     */
    public static void main(String[] args){
        Map<String, String> map = new LinkedHashMap<String, String>();
        map.put("1回目", "One");
        map.put("2回目", "Two");
        map.put("3回目", "Three");
        // 格納順に値をコンソール出力
        for(String key : map.keySet()){
            System.out.println("キー:" + key + ", 値:" + map.get(key));
        }
    }
}

で、コンソール出力がこんなかんじ。

キー:1回目, 値:One
キー:2回目, 値:Two
キー:3回目, 値:Three

でもパフォーマンスはちょっと落ちるらしい。
Java6で改善されてたりしないのかな。
J2SE 5.0 Tiger 虎の穴 拡張 for 文

[java]djUnitをJunit4以降で利用する方法

@Testとimport static を使えばこんなに簡単〜

テスト対象クラスが↓こんなかんじとして

/**
 * テスト対象
 * System.exit()を返すだけのクラス
 * @author kazuki-kido
 */
public class Sample {
    /**
     * メインメソッド
     * @param args
     */
    public static void main(String[] args){
        System.exit(0);
    }
}

雛形が↓こんなかんじ。

import org.junit.Test;

import static jp.co.dgic.testing.framework.DJUnitTestCase.*;

/**
 * テストクラス
 * @author kazuki-kido
 */
public class SampleTest {
    /**
     * テストメソッドは通常のJUnit4の記述と同様
     */
    @Test
    public void simpleTest(){
        addReturnValue("java.lang.System", "exit");
        // テスト対象メソッドを実行
        Sample.main(null);
        // 1回のみ呼ばれていることを確認
        assertEquals(1, getCallCount("java.lang.System", "exit"));
        // System.exit(int)が0を返すことを確認
        assertEquals(0, (int)((Integer) getArgument("java.lang.System", "exit", 0)));
    }
}

何が嬉しいかっていうと、djUnitPOJO記述のJUnitに適用できるってこと。
DJUnitTestCaseを継承する必要なし。メソッド名の制約もなくなって非常においしいですね。

djUnit

複数キーワードに対応してみた

@echo on
for %%i in (".flv",".divx",".txt") do (
mkdir %%i
for /r %%I in (*%%i*) do move "%%I" %%i
)
pause

".flv",".divx",".txt"の部分がキーワードになります。
カンマ(,)で繋げばいくつでも定義できます。
ただ、下層フォルダ全てを対象にしてガッツリ移動させてしまうので、定義を間違えたり、実行するフォルダを間違えたりすると、取り返しが利きません。
後の祭りにならないように注意してください。
「元に戻す」機能がないってのがバッチの厳しいところです。

ファイルをキーワードでフォルダに振り分けるバッチ

1.テキストエディタに以下コードをコピペ

%echo on
set KEYWORD="キーワード"
mkdir %KEYWORD%
for /r %%i in (*%KEYWORD%*) do move "%%i" %KEYWORD%

2."キーワード"の部分を、整理する対象ファイル名に共通するキーワードに変更(".flv"とか)
3.適当に.batファイルとして保存。(「move.bat」とか)
4.できたファイルを整理したいフォルダにコピー。
5.実行 ⇒ フォルダ以下の全階層を走査して、キーワードに合致するファイルを「./キーワード」フォルダ以下に移動

よく利用してます。昔Javaで同じようなものを一生懸命コーディングしたのですが、コレの方が1000倍ラク