2017-01-20 44 views
2
var persons: List<Person> = readPersonsFile("persons.txt"); 
    ListSort.sort(persons, function(personA, personB): Int 
    { 
     return Person.compare(personA.first(), personB.first()); 
    }); 

我只是想對這個列表進行排序。我是haxe的新手,它給了我這個錯誤:Haxe,ListSort.sort()問題

src/Main.hx:18:characters 2-15:約束檢查失敗sort.T src/Main.hx:18:字符2-15 :列表應該是{prev:List,next:List} src/Main.hx:18:characters 2-15:列表中沒有下一個字段

這對我來說很奇怪,因爲它聽起來像是想要我傳遞一個含有兩個不同列表的隱式對象,如果這真的是這樣的話......如果這是真的,那麼它不是絕對的。謝謝。

+0

'haxe.ds.ListSort'不用於對'List '中的元素進行排序。主要目的是用「next」和「prev」屬性對「自定義」鏈接元素進行排序。 https://github.com/HaxeFoundation/haxe/blob/development/std/haxe/ds/ListSort.hx –

+0

確定'readPersonsFile()'返回一個列表?也許它是'null',你可能首先要做一個'if(persons!= null)'。我認爲ListSort建議它排序一個列表,所以我認爲它應該工作。 –

+0

我知道readPersonsFile()沒有返回null,因爲這些錯誤是在構建文件。 Mihail Ignatiev,如果haxe.ds.ListSort不是要對List進行排序,而是什麼?因爲我看了ArraySort,但這是爲了Array? –

回答

0

從我可以看到haxe.ds.ListSort是假設工作的鏈接列表像結構不haxe列表。如果你想要做的只是排序,則列表可能更容易使用數組。如果你的目標是使用這種特殊類型排序,並希望避免使用數組(因爲例如內存限制),你只需要爲它提供如下的結構:

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

(如列表項internaly使用haxe List actualy) 但我想你只想對「列表」進行排序。所以,如果這就是你是什麼它可能看起來像這樣經過:

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)'; 
} 
} 
0

ListSort只有supposed to work上單獨或雙向鏈表; List類既不是這些(儘管它與它們共享一些API,但具有不同的時間和空間成本)。

在你的情況,你也許可以改變readPersonsFile返回任何一個Arrayhaxe.ds.GenericStack,並請使用persons.sort(cmp)ListSort.sortSingleLinked(persons.head, cmp)。另外,如果有必要,您可以輕鬆地將任何可迭代 - 即具有iterator:Void->Iterator<T>方法的任何對象 - 轉換爲Lambda.array(iterable)的數組。


documentation缺乏對T參數的必要約束。這是我將盡快報告的文檔生成器中的一個錯誤。