3

言語を変更できる単純なプログラムを作成しています。ファイル myBundle.properties のプロパティのリストを文字列配列に変換します。

これはファイル myBundle.properties です:

 #default
 test1=Hello1
 test2=Hello2
 test3=Hello3
 test4=Hello4
 test5=Hello5
 test6=Hello6

そして、これはJavaコードです:

import java.util.*;

class BundleTest {

    BundleTest() {
        String[] s = returnStringArray(Locale.ENGLISH);
        for(int i=0; i<s.length; i++) {
            System.out.println(s[i]);
        }
    }

    private String[] returnStringArray(Locale language) {
        try {
            ResourceBundle labels = ResourceBundle.getBundle("myBundle", language);
            Enumeration<String> keys = labels.getKeys();
            Vector v = new Vector();
            String key = null;
            while (keys.hasMoreElements()) {
                v.add(keys.nextElement());
            }
            String[] s = new String[v.size()];
            for(int i=0; i<s.length; i++) {
                s[i] = (String)v.elementAt(i);
            }
            return s;
        } catch (MissingResourceException mre) {
            System.out.println("Risorse della lingua non trovate!");
            return null;
        }
    }

    public static void main(String[] args) {
        new BundleTest();
    }
}

しかし、驚くべきことに、プログラムを実行すると、文字列がランダムな順序で返されます。列挙型がこの奇妙な動作をするのはなぜですか?

bash-4.1$ java BundleTest
test1
test6
test4
test5
test2
test3
4

4 に答える 4

8

ResourceBundle クラスの正確な詳細はわかりませんが、コード例を見ると、キーと値のペアがあるようです。

これは、そのコンテンツをHashMapに格納することを示唆しています。(繰り返しますが、私は ResounrceBundle を知らないので、これは推測です) HashMap キー (および値) は、特定のキーの値を簡単に見つけることができるような方法で格納されるため、順不同です。

于 2012-06-18T15:33:55.037 に答える
3

交換する場合はSe

Enumeration<String> keys = labels.getKeys();

List<String> keys =  Collections.list( labels.getKeys() );
Collections.sort(keys);

役立ちます

于 2012-06-18T16:27:50.787 に答える
2

ほとんどの場合、ストレージにHashMapを内部的に使用するPropertyResourceBundleを取得しています。HashMap は順序付けされていません。

これは、元のプロパティ ファイルに基づいて並べ替えられた順序で列挙するためではなく、キーで値を取得するために ResourceBundles を使用する必要があるためです。

于 2012-06-18T15:43:19.510 に答える
0

順序を想定しない場所が 2 つあります。
1.Vector から 2.labels.getKeys();

コレクションによってインスタンス化されていない列挙型で試してください。

于 2012-06-18T15:42:04.750 に答える