2015-05-21 43 views
-1

我有它的文本沿三個整數值。我的要求是給所有人排名。如何比較三個整數值?

例如我有A = 50分,B = 500分,C = 50分。

現在我想比較所有這些,找到最大和平等的價值和它根據名稱(如,A/B/C)。

EDIT :: 作爲輸出它應該返回,B =第一等級,A =第二等級,C =第二等級。

如果任何人有我如何可以實現代碼按我的要求,那麼任何想法,這將是巨大的。

在此先感謝。

public class ScoreVO implements Comparator<Integer> { 

    private String playerName = Constants.BLANK_STRING; 
    private int playerScore; 

    public String getPlayerName() { 
     return playerName; 
    } 

    public void setPlayerName (String playerName) { 
     this.playerName = playerName; 
    } 

    public int getPlayerScore() { 
     return playerScore; 
    } 

    public void setPlayerScore (int playerScore) { 
     this.playerScore = playerScore; 
    } 

    @Override 
    public int compare (Integer o1, Integer o2) { 
     return o2.compareTo (o1); 
    } 
} 

這裏是我的類比較<>。

請建議我,如果我錯了。

+1

那麼,你到目前爲止嘗試過什麼?你有沒有考慮創建一個代表名稱/成績對的班級,然後實施「可比較的」並進行排序? –

+0

@Jon Skeet,是的,我創建了具有名稱和分數的類,還實現了Comparator 。但在此之後,我如何比較所有這些值並找到更大/相等的值。 – anddev

+1

你爲什麼要實施'Comparator ''?你會實現'Comparable '或任何類名。請告訴我們你已經嘗試了什麼 - 你有多遠。 –

回答

1

樣本運行代碼給出了玩家等級一起顯示如下按您的要求輸出。有一個單獨的方法assignRank(名單<>),你可以用它來行列分配給玩家。得分列表:[ScoreVO [playerName = B,playerScore = 500,playerRank = 1],ScoreVO [playerName = A,playerScore = 50,playerRank = 2],ScoreVO [playerName = C,playerScore = 50,playerRank = 2]]

public class ScoreExample { 

    public static void main(String[] args) { 
     List<ScoreVO> scoreList = new ArrayList<ScoreVO>(); 
     scoreList.add(new ScoreVO("A", 50)); 
     scoreList.add(new ScoreVO("C", 50)); 
     scoreList.add(new ScoreVO("B", 500)); 
     Collections.sort(scoreList); 
     assignRank(scoreList); 
     System.out.println("Score List: "+scoreList); 
    } 

    private static void assignRank(List<ScoreVO> scoreList) { 
     int rank = 0; 
     int score = 0; 
     for(ScoreVO scoreVO : scoreList) { 
      if(score != scoreVO.getPlayerScore()) { 
       rank++; 
       scoreVO.setPlayerRank(rank); 
       score = scoreVO.getPlayerScore(); 
      } else { 
       scoreVO.setPlayerRank(rank); 
      } 
     } 
    } 
} 
class ScoreVO implements Comparable<ScoreVO> { 
    public String playerName; 
    public int playerScore; 
    public int playerRank; 

    public ScoreVO(String playerName, int playerScore) { 
     this.playerName = playerName; 
     this.playerScore = playerScore; 
    } 

    public String getPlayerName() { 
     return playerName; 
    } 

    public void setPlayerName(String playerName) { 
     this.playerName = playerName; 
    } 

    public int getPlayerScore() { 
     return playerScore; 
    } 

    public void setPlayerScore(int playerScore) { 
     this.playerScore = playerScore; 
    } 

    public int getPlayerRank() { 
     return playerRank; 
    } 

    public void setPlayerRank(int playerRank) { 
     this.playerRank = playerRank; 
    } 

    @Override 
    public int compareTo(ScoreVO o) { 
     if(o.getPlayerScore() != getPlayerScore()) { 
      if(getPlayerScore() > o.getPlayerScore()) 
       return -1; 
      else 
       return 1; 
     } 
     return getPlayerName().compareTo(o.getPlayerName()); 
    } 

    @Override 
    public String toString() { 
     return "ScoreVO [playerName=" + playerName + ", playerScore=" 
       + playerScore + ", playerRank=" + playerRank + "]"; 
    } 
} 
+0

謝謝Kulin。這對我來說很有魅力。親愛的,你挽救了我的一天。祝福你。!! – anddev

0

ScoreVO應該實現Comparable<ScoreVO>。而你compareTo方法是這樣的:

@Override 
public int compareTo (ScoreVO o) { 
    if(playerScore != o.playerScore) 
     return Integer.compare(playerScore, o.playerScore); 
    return playerName.compareTo(o.playerName); 
} 
+0

這是不正確的。 Comparable.compareTo收到一個參數,並打算比較它與此。 –

+0

@sharonbn你是對的,謝謝,我只是編輯它:) –

+0

@Pham Trung,這將返回我排序數據是真的。但是在那之後,我應該怎麼做才能讓這三個價值共同作用呢?那我想知道什麼?我應該通過if/else比較那些嗎? – anddev

0

你應該implment可比訂購purpuses和equals()方法的公式(即可以使用的compareTo)

這樣

public class ScoreVO implements Comparable<ScoreVO> { 

    @Override 
    public int compareTo(ScoreVO other) { 
     return other == null ? 1 : getPlayerScore() - other.getPlayerScore(); 
    } 

    @Override 
    public boolean equals(object other) { 
     return !(other instanceof ScoreVO) ? false : compareTo(other) == 0 ; 
    } 
} 

然而,你可能想根據玩家的名字來比較平等。考慮將ScoreVO對象放在地圖中 - 關鍵是什麼?所以 -

@Override 
    public boolean equals(object other) { 
     return other == null || !(other instanceof ScoreVO) ? false :    
       getPlayerName.equals(other.getPlayerName()) ; 
    } 
+0

感謝您分享此代碼。但我不明白我怎麼能在我的活動中使用它來顯示1,2,3級別。 – anddev

+0

您應該創建一個ScoreVO對象列表。填充它並對其進行分類。 –

0

由於只有三個值,所以可以對所有操作進行硬編碼。你可以想到一個非常緊湊和有效的方法來解決這個問題。

每個兩個值的比較都可以給出結果>,=<。將值0,12指定爲這些值,可以使用基本3編碼將三個比較打包爲單個數字。您將以範圍026範圍內的一個數字結尾,並且每個不同的值對應於您可以製表(或在switch語句中處理)的不同答案。

int Compare(int A, int B) { return A > B ? 0 : (A == B ? 1 : 2); } 

char* Answer[27]= { "A1B2C3", "A1B1C3", "B1A2C3", ... }; // To be filled 
return Answer[Compare(A, B) + 3 * compare(B, C) + 9 * compare(A, C)];