2013-03-15 223 views
0

如下我已經定義了一個抽象類對象中的任意數組:爪哇排序

public abstract class Move implements Comparable<Move> { 
protected int cell; 
protected int weight;  

public int getWeight() 
{ 
    return this.weight; 
} 

public void setWeight(int value) 
{ 
    this.weight = value; 
} 

protected Move(int cell) 
{ 
    this.cell = cell; 
    this.weight = 0; 
} 

protected Move(int cell, int weight) 
{ 
    this.cell = cell; 
    this.weight = weight; 
} 

@Override 
public int compareTo(Move m) 
{ 
    return this.weight - m.weight; 
} 

我有一個額外的2類,擴展此類(歸類MoveLeft和MoveRight的)。我想補充這兩種類型的對象類型移動的一個列表,然後排序使用Collections.sort:

List<Move> moves = new ArrayList<Move>(someSize); 
moves.add(new MoveLeft(cell1)); 
moves.add(new MoveRight(cell2)); 
moves.add(new MoveRight(cell3)); 
moves.add(new MoveLeft(cell4)); 
Collections.sort(moves); 

然而,該列表進行排序,通過細胞代替按重量計。

不可能在同一類中混合不同的子類實例嗎?

注意:我爲子類的構造函數中的權重設置了一個唯一的值。

+0

做的子類重寫compareTo? – 2013-03-15 13:24:51

+0

不,他們沒有。他們應該嗎? – 2013-03-15 13:25:36

+0

不......這將是您見過的行爲的一種解釋。 – 2013-03-15 13:26:04

回答

0

您必須創建一個Move類型的數組,然後將它與派生類混合使用,然後像往常一樣對它進行移動和排序,然後可以使用isntanceOf和downcast檢查實際的類。

+0

不需要轉換:Collections.sort()方法不需要該轉換。在這種情況下,它將看到對象實現Comparable並調用compareTo()方法,而不管數組類型或保存實例的引用類型。 – 2013-03-15 13:32:49

0

這真的是一個很長的評論,而不是一個答案。

我寫了一個簡單的測試程序,它似乎排序正確。輸出是[Move [cell=10, weight=1], Move [cell=1, weight=100]],這既不是我添加元素的順序,也不是升序單元格的順序,而是遞增的權重順序。

我注意到你有兩個相同類型的構造函數參數。我建議非常仔細地檢查他們是否沒有得到改變。如果這不是問題,我建議嘗試修改我的測試程序,使其更接近實際代碼,直到它再現問題。這裏是我的測試程序:

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 

public class Test { 
    public static void main(String[] args) { 
    List<Move> list = new ArrayList<Move>(); 
    list.add(new MoveRight(1, 100)); 
    list.add(new MoveLeft(10, 1)); 
    Collections.sort(list); 
    System.out.println(list); 
    } 
} 

abstract class Move implements Comparable<Move> { 
    protected int cell; 
    protected int weight; 

    public int getWeight() 
    { 
    return this.weight; 
    } 

    public void setWeight(int value) 
    { 
    this.weight = value; 
    } 

    protected Move(int cell) 
    { 
    this.cell = cell; 
    this.weight = 0; 
    } 

    protected Move(int cell, int weight) 
    { 
    this.cell = cell; 
    this.weight = weight; 
    } 

    @Override 
    public int compareTo(Move m) 
    { 
    return this.weight - m.weight; 
    } 

    @Override 
    public String toString() { 
    return "Move [cell=" + cell + ", weight=" + weight + "]"; 
    } 
} 

class MoveLeft extends Move { 

    protected MoveLeft(int cell, int weight) { 
    super(cell, weight); 
    } 

} 

class MoveRight extends Move { 

    protected MoveRight(int cell, int weight) { 
    super(cell, weight); 
    } 

} 
+0

是否做到了這一點,我也確保每個重量值都是唯一的。它仍然按單元格排序對象 – 2013-03-15 13:50:57

+0

@ Ivan-MarkDebono在這種情況下,我認爲你最好的方法是在[SSCCE](http://sscce.org)上工作,可以通過添加到我的測試程序或通過剝離你的真實代碼。 – 2013-03-15 13:57:47