我正在创建一个可以更改语言的简单程序,我将转换字符串数组中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
答案 0 :(得分:8)
我不知道ResourceBundle类的确切细节,但在查看代码示例时,似乎它具有键/值对。
这表明它将其内容存储在HashMap中。 (再次,因为我不知道ResounrceBundle,这是预感) HashMap键(和值)是无序的,因为它们的存储方式使得可以很容易地找到给定键的值。
答案 1 :(得分:3)
如果替换
Enumeration<String> keys = labels.getKeys();
与
List<String> keys = Collections.list( labels.getKeys() );
Collections.sort(keys);
帮助
答案 2 :(得分:2)
您很可能会收到PropertyResourceBundle,内部使用HashMap进行存储。 HashMaps没有订购。
这是因为ResourceBundles应该用于按键检索值,而不是用于根据原始属性文件按排序顺序进行枚举。
答案 3 :(得分:0)
有两个地方我不会接受订单 1.从Vector和 2.labels.getKeys();
在未通过集合实例化的枚举上尝试。