我使用HashMap<String,Integer>
作爲一種定時投票系統。其中字符串是對象的名稱,整數是對象具有的投票數量。我試圖做的是排序整數遞減,如果他們是一個領帶,我想選擇誰以前沒有贏得投票(如果他們中的任何一個)如何在Java中對HashMap進行排序?
我試過用TreeMap
,但它似乎沒有做我想做的事情,因爲它根據鍵的值排序,而我需要排序的值。也有些時候,兩個對象都可能具有相同數量的投票,因此不起作用。
我使用HashMap<String,Integer>
作爲一種定時投票系統。其中字符串是對象的名稱,整數是對象具有的投票數量。我試圖做的是排序整數遞減,如果他們是一個領帶,我想選擇誰以前沒有贏得投票(如果他們中的任何一個)如何在Java中對HashMap進行排序?
我試過用TreeMap
,但它似乎沒有做我想做的事情,因爲它根據鍵的值排序,而我需要排序的值。也有些時候,兩個對象都可能具有相同數量的投票,因此不起作用。
從here兩者,這裏是你如何排序Map
其價值(按降序排列)與JDK 8:
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
return map.entrySet().stream().sorted(Map.Entry.comparingByValue(Collections.reverseOrder())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
}
例子:
Map<String, Integer> votes = new HashMap<>();
votes.put("A", 5);
votes.put("B", 17);
votes.put("C", 1);
System.out.println(votes);
>> {A=5, B=17, C=1}
votes = sortByValue(votes);
System.out.println(votes);
>> {B=17, A=5, C=1}
這是很好的價值以相反的順序排序,但怎麼打破領帶? –
@FedericoPeraltaSchaffner對於一個輪胎,我不太明白OP的意思,如果他們以前贏得了投票或沒有。有沒有存儲信息的變量?如果OP能夠澄清,那麼我可以編輯我的答案。 –
我的理解是,即如果有3票保羅和2票贊成安,並且安被投票,那麼安需要在保羅之前出現在排序中,因爲保羅以前就是投票的人。也許@ ctooley17可以澄清這... –
爲了能夠確定結果,你需要的不僅僅是一個整數。一種解決方案可能是創建一個自定義對象,該對象包含額外信息並實現可比較的(類似於Walter所說的)。
從我的帖子中可以看出,當票數相同時,您希望結果成爲最近未被選中的選項。如果是這種情況,那麼下面的解決方案,它使用日期作爲輔助信息,應該工作。
import java.util.Date;
public class VoteOption implements Comparable<VoteOption>{
private String name;
private Integer votes;
private Date lastVote;
/** Constructor */
public VoteOption(String name){
this.name = name;
this.lastVote = new Date();
this.votes = 0;
}
/** gets the name of this option */
public String name(){
return this.name;
}
/** gets the number of votes this option currently has */
public int votes(){
return this.votes;
}
/** Call this method if the vote passed with this option.
* It will update the lastVote date so that this will become the
* last option to be picked if there is a tie in the next vote. */
public void votePassed(){
this.lastVote = new Date();
}
/** resets the vote count back to 0 */
public void resetVoteCount(){
this.votes = 0;
}
/** Adds 1 vote to the vote count */
public void vote(){
this.votes ++;
}
@Override
public int compareTo(VoteOption otherOption){
int compareVotes = this.votes.compareTo(otherOption.votes);
if(compareVotes!=0){
return compareVotes;
} else {
//handle vote ties
int compareDates = this.lastVote.compareTo(otherOption.lastVote);
return compareDates;
}
}
}
要排序的這些選項的列表,你應該叫
Collections.sort(list);
你可以把你的代碼, –
您可以使用您designfor TIS例如一個簡單的排序algorythm的例子,但如果你把一些你的代碼是有幫助的 –
@ maytham-ɯɐɥʇʎɐɯ我不認爲這是重複的,因爲破門者的要求 –