2017-12-19 9 views
0

Scala 2.11.8を使用しています。戻り値を保証する方法StringListが注文されます:Scala

私のプロパティファイルからクエリを読み込もうとしています。各クエリセットには複数の部分があります(以下で説明します)

これらのクエリを実行する必要がある特定のシーケンスがあります。

コード:

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がソートされるという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

を使用してソート
関連する問題