【问题标题】:Haxe, ListSort.sort() issueHaxe,ListSort.sort() 问题
【发布时间】:2017-01-20 04:57:54
【问题描述】:
var persons: List<Person> = readPersonsFile("persons.txt");
ListSort.sort(persons, function(personA, personB): Int
{
    return Person.compare(personA.first(), personB.first());
});

我只是想对这个列表进行排序。它给了我这个错误:

Constraint check failure for sort.T
List<Person> should be { prev : List<Person>, next : List<Person> }
List<Person> has no field next

这对我来说很奇怪,因为这听起来像是要我传递一个带有两个不同列表的隐式对象,如果真的是这样的话……如果这是真的,那并不是很绝缘。

【问题讨论】:

  • haxe.ds.ListSort 并非设计用于对List&lt;T&gt; 中的元素进行排序。它的主要目的是使用 next & prev 属性对“自定义”链接元素进行排序。 github.com/HaxeFoundation/haxe/blob/development/std/haxe/ds/…
  • 您确定readPersonsFile() 返回一个列表吗?也许是null,你可能想先做一个if(persons!=null)。我认为 ListSort 建议它对 List 进行排序,所以我认为它应该可以工作。
  • 我知道 readPersonsFile() 没有返回 null,因为这些错误是在构建文件时出现的。 Mihail Ignatiev,如果 haxe.ds.ListSort 不是要对 List 进行排序,那是什么?因为我查看了 ArraySort,但那是针对 Array 的?

标签: haxe


【解决方案1】:

ListSort 仅在单链表或双链表上是 supposed to workList 类不是这些(尽管它确实与它们共享一些 API,但时间和空间成本不同)。

在您的情况下,您可以更改readPersonsFile 以返回Arrayhaxe.ds.GenericStack,并使用persons.sort(cmp)ListSort.sortSingleLinked(persons.head, cmp)

此外,如有必要,您可以轻松地将任何可迭代对象(即任何具有iterator:Void-&gt;Iterator&lt;T&gt; 方法的对象)转换为具有Lambda.array(iterable) 的数组。


documentation 缺少对 T 参数的必要约束。这是文档生成器中的一个错误,我会尽快报告。

【讨论】:

    【解决方案2】:

    据我所知,haxe.ds.ListSort 应该适用于类似链表的结构,而不是 Haxe 列表。如果您只想对列表进行排序,则只需使用Array 可能会更容易。如果您的目标是使用这种特定类型的排序并希望避免使用数组(例如由于内存限制),您只需为其提供如下结构:

    typedef PersonListItem = {
        var prev:PersonListItem;
        var next:PersonListItem;
        var person:Person;
    }
    

    (实际上就像 Haxe List 内部使用的ListItem

    但我假设您只想对“列表”进行排序。因此,如果这就是你所追求的,它可能看起来像这样:

    class Test {
        static function main() {
            var persons:Array<Person> = readPersonsFile("persons.txt");
            trace(persons.join(","));
            persons.sort(Person.compare);
            trace(persons.join(","));
            trace(persons[0]);
        }
    
        static function readPersonsFile(name:String):Array<Person> {
            var result = new Array<Person>();
            result.push(new Person(8));
            result.push(new Person(1));
            result.push(new Person(2));
            result.push(new Person(6));
            result.push(new Person(0));
            result.push(new Person(9));
            result.push(new Person(3));
            result.push(new Person(7));
            result.push(new Person(4));
            result.push(new Person(5));
            return result;
        }
    }
    
    class Person {
        var id:Int;
    
        public function new(id) {
            this.id = id;
        }
    
        public static function compare(a:Person, b:Person):Int {
            return a.id - b.id;
        }
    
        public function toString():String {
            return 'Person($id)';
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      相关资源
      最近更新 更多