2013-02-13 41 views
0

我想通過使用Java的比較器對函數的EList進行排序,但是在調用sort()之後,列表不會排序。Xtend使用ECollections排序

我實現它的方式是這樣的:

//Func.xtend <-- Start --> 

public class NameComparator implements Comparator<Function_Name> { 
    override int compare (Function_Name function1, Function_Name function2) 
    { 
     return function1.func.compareToIgnoreCase(function2.func) 
    } 
} 

public class CheckNames { 
    def void checkDuplicateNames(Main_func para_func) { 
     var EList<Function_Name> functions = para_func.getContains()   
     var NameComparator pc = new NameComparator() 

     functions.sort(pc) //<-- sorting here 

     var Iterator<Function_Name> oIt = functions.iterator() 
     while (oIt.hasNext) 
     {   
      var Function_Name func = oIt.next () 
      System::out.println(func.func.toString) 
     } 
    } 
} 

// <-- End --> 

我做錯什麼了嗎?理論上,調用functions.sort(pc)之後,變量「functions」中的內容應該已經排序了,對吧?還是我還需要做一些處理?

回答

3

據我所知,Xtend中的List::sort沒有就地排序,但返回一個新的排序列表。所以你必須改爲撥打List::sortInPlace

除此之外,當您嘗試對唯一的 EList(例如遏制)進行排序時,可能會遇到問題。在排序操作過程中(Xtend實際上爲此調用java.util.Collections.sort),一些元素可能暫時包含在列表中兩次。但是,當您嘗試第二次添加元素時,唯一列表會檢查重複項並拋出IllegalArgumentException(請參閱AbstractEList.set(in, E))。爲了避免這種情況,你應該像這樣排序獨特的EList:

var sortedFunctions = functions.sort(pc) 
functions.clear() 
functions.addAll(sortedFunctions) 
+0

謝謝!它現在工作!你的回答非常有幫助。 – 2013-02-14 06:39:59