2012-06-18 2 views
3

언어를 변경할 가능성이있는 간단한 프로그램을 만들고 문자열 배열의 파일 myBundle.properties에있는 속성 목록을 변환합니다. Java Enumeration이 속성 목록을 순서대로 반환하지 않는 이유는 무엇입니까?

는 파일 myBundle.properties입니다 :

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

그리고 이것은 자바 코드이다 : 나는이 프로그램을 실행할 때 캐주얼 나에게 문자열을 반환 놀랍게도

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 
+0

을하는 데 도움이됩니다. Vector의 javadoc을 체크 아웃하면 지원되는 대안을 찾을 수 있습니다. (문제를 골라서 죄송합니다.) – BlackVegetable

+1

'ResourceBundle.getKeys()'는 * ordered * 열거 형을 어디에서 반환합니까? Thsi는 Enumeration과 아무 관련이 없지만 그 뒤에있는 소스는 아마도 Set 일 것이고 따라서 순서를 유지하지 않을 것입니다. –

답변

8

ResourceBundle 클래스의 정확한 세부 사항을 모르겠지만 코드 예제를 살펴보면 키/값 쌍이있는 것으로 보입니다.

이것은 콘텐츠가 HashMap에 저장되어 있음을 나타냅니다. (ResounrceBundle을 모르는 것처럼 이것은 직감적입니다.) HashMap 키 (및 값)는 값이 지정된 키에서 쉽게 찾을 수 있도록 저장되므로 정렬되지 않습니다.

+0

실제로 hashKey는 hashKey를 기반으로 요소를 추가하지 않았습니까? – enkor

0

두 곳에서 주문하지 않을 것입니다.
1. 벡터에서 및 2.labels.getKeys();

컬렉션에 의해 인스턴스화되지 않은 enum에서 시도해보십시오.

2

대부분이 PropertyResourceBundle이며, 내부적으로 저장하려면 HashMap을 사용합니다. HashMaps는 주문하지 않습니다.

원래의 특성 파일을 기반으로 정렬 된 순서로 열거하지 않고 ResourceBundle을 키로 값을 검색하는 데 사용해야하기 때문입니다.

3

괜찮다

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

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

를 교체 할 경우 내가 벡터 방식에 의해, 사용되지 않는 것으로 판단

+1

나는 목표가 키의 "자연스러운"순서가 아니라 속성 파일에서 순서대로 정렬하는 것이라고 생각한다. – smp7d

+0

제공된 예제에서 동일한 순서입니다. –

관련 문제