【问题标题】:Why Java Enumeration doesn't return properties list in order?为什么 Java 枚举不按顺序返回属性列表?
【发布时间】:2012-06-18 15:26:43
【问题描述】:

我正在创建一个可以更改语言的简单程序,我会将文件 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();
    }
}

但是,令人惊讶的是,当我执行程序时,它会以随意的顺序返回字符串。为什么 Enumeration 会有这种奇怪的行为?

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

【问题讨论】:

  • 顺便说一句,我相信 Vector 已被弃用。查看 Vector 的 javadoc 将为您指出支持的替代方案。 (抱歉转移话题。)
  • 它在哪里说ResourceBundle.getKeys() 返回一个有序 枚举? Thsi 与Enumeration 无关,但其背后的来源可能是Set,因此不保留任何顺序。

标签: java


【解决方案1】:

我不知道 ResourceBundle 类的确切细节,但是在查看您的代码示例时,它似乎具有键/值对。

这表明它将其内容存储在HashMap 中。 (同样,由于我不知道 ResounrceBundle,这是一种预感) HashMap 键(和值)是无序的,因为它们的存储方式可以很容易地找到给定键的值。

【讨论】:

  • 确实,HashMap不是根据它的hashKey放置添加元素的吗?
【解决方案2】:

如果要替换的话

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

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

帮助

【讨论】:

  • 我认为目标是按它们在属性文件中的顺序排序,而不是按键的“自然”顺序。
  • 与提供的示例中的顺序相同。
【解决方案3】:

您很可能会取回PropertyResourceBundle,它在内部使用HashMap 进行存储。 HashMap 没有排序。

这是因为 ResourceBundles 应该用于按键检索值,而不是根据原始属性文件按排序顺序进行枚举。

【讨论】:

    【解决方案4】:

    有两个地方我不会假设顺序。
    1.从向量和 2.labels.getKeys();

    在未由集合实例化的枚举上尝试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2017-12-05
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      相关资源
      最近更新 更多