2017-12-19 6 views
0

스칼라 2.11.8을 사용하고 있습니다.반환 값을 보장하는 방법 StringList가 주문됩니다. 스칼라

내 속성 파일에서 쿼리를 읽으려고합니다. 각 쿼리 세트에는 여러 부분이 있습니다 (아래 설명 참조)

그리고 이러한 쿼리를 실행해야하는 특정 순서가 있습니다.

코드 :

import com.typesafe.config.ConfigFactory 
    object ReadProperty { 
     def main(args : Array[String]): Unit = { 
     val queryRead = ConfigFactory.load("testqueries.properties").getConfig("select").getStringList("caseInc").toArray() 

     val localRead = ConfigFactory.load("testqueries.properties").getConfig("select").getStringList("caseLocal").toArray.toSet 

     queryRead.foreach(println) 
     localRead.foreach(println) 
     } 
    } 

PropertyFile 내용 :

select.caseInc.2 = Select emp_salary, emp_dept_id from employees 
select.caseLocal.1 = select one 
select.caseLocal.3 = select three 
select.caseRemote.2 = Select e1.emp_name, d1.dept_name, e1.salary from emp_1 e1 join dept_1 d1 on(e1.emp_dept_id = d1.dept_id) 
select.caseRemote.1 = Select * from departments 
select.caseInc.1 = Select emp_id, emp_name from employees 
select.caseLocal.2 = select two 
select.caseLocal.4 = select four 

출력 : 우리가 OUTP에서 볼 수 있듯이

Select emp_id, emp_name from employees 
Select emp_salary, emp_dept_id from employees 
select one 
select two 
select three 
select four 

결과는 이다.으로 분류된다. 속성에서 당신이 시퀀스에서 쿼리의 번호를 매기려고 시도했다면 (caseInc, caseLocal을 인수로 전달) 실행해야합니다.

getStringList()를 사용하면 항상 제공하는 시퀀스 번호에 따라 정렬 된 목록을 얻게됩니다.

toArray()를 사용하여 시도한 경우에도 & toArray(). toSet 정렬 된 출력을 가져오고 있습니다.

지금까지의 좋은

하지만 항상 내가 등록 정보 파일에 제공 한 정렬 된 순서로 반환됩니다 있는지 확인하는 방법에 대해 설명합니다. 어떻게 든 반환 된 List가 Sorted 될 것이라고 말하는 API를 찾을 수 없기 때문에 혼란 스럽습니다.

답변

0

나는이 사실에 의지 할 수 있다고 생각합니다. DefaultTransformer의 코드로 보면 당신은 논리의 다음 조각을 볼 수 있습니다 사용 소트

} else if (requested == ConfigValueType.LIST && value.valueType() == ConfigValueType.OBJECT) { 
     // attempt to convert an array-like (numeric indices) object to a 
     // list. This would be used with .properties syntax for example: 
     // -Dfoo.0=bar -Dfoo.1=baz 
     // To ensure we still throw type errors for objects treated 
     // as lists in most cases, we'll refuse to convert if the object 
     // does not contain any numeric keys. This means we don't allow 
     // empty objects here though :-/ 
     AbstractConfigObject o = (AbstractConfigObject) value; 
     Map<Integer, AbstractConfigValue> values = new HashMap<Integer, AbstractConfigValue>(); 
     for (String key : o.keySet()) { 
      int i; 
      try { 
       i = Integer.parseInt(key, 10); 
       if (i < 0) 
        continue; 
       values.put(i, o.get(key)); 
      } catch (NumberFormatException e) { 
       continue; 
      } 
     } 
     if (!values.isEmpty()) { 
      ArrayList<Map.Entry<Integer, AbstractConfigValue>> entryList = new ArrayList<Map.Entry<Integer, AbstractConfigValue>>(
        values.entrySet()); 
      // sort by numeric index 
      Collections.sort(entryList, 
        new Comparator<Map.Entry<Integer, AbstractConfigValue>>() { 
         @Override 
         public int compare(Map.Entry<Integer, AbstractConfigValue> a, 
           Map.Entry<Integer, AbstractConfigValue> b) { 
          return Integer.compare(a.getKey(), b.getKey()); 
         } 
        }); 
      // drop the indices (we allow gaps in the indices, for better or 
      // worse) 
      ArrayList<AbstractConfigValue> list = new ArrayList<AbstractConfigValue>(); 
      for (Map.Entry<Integer, AbstractConfigValue> entry : entryList) { 
       list.add(entry.getValue()); 
      } 
      return new SimpleConfigList(value.origin(), list); 
     } 
    } 

주 키가 다음 정수 값으로 구문 분석하는 방법을 Integer.compare