0

我正在尝试使用 Java 的 Comparator 对函数的 EList 进行排序,但在调用 sort() 后列表未排序。

我实现它的方式是这样的:

//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”中的内容应该已经排序了,对吧?还是我还需要做一些处理?

4

1 回答 1

3

据我所知,List::sort在 Xtend 中不会就地排序,而是返回一个新的排序列表。所以你必须打电话List::sortInPlace

除此之外,当您尝试对唯一的EList(例如,容器)进行就地排序时,您可能会遇到问题。在排序操作期间(Xtend 实际上要求java.util.Collections.sort这样做),某些元素可能会暂时在列表中包含两次。但是,唯一列表会检查重复项并IllegalArgumentException在您尝试第二次添加元素时抛出 an(请参阅 参考资料AbstractEList.set(in, E))。为避免这种情况,您应该像这样对唯一的 EList 进行排序:

var sortedFunctions = functions.sort(pc)
functions.clear()
functions.addAll(sortedFunctions)
于 2013-02-13T12:44:07.047 回答