HashMap<String,UserStats> sortieren?

gamp

Mitglied
Hallo!
Code:
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;

public class Test {
	
	public static void main(String[] args) {

		UserStats user1 = new UserStats("p");
		UserStats user2 = new UserStats("m");
		UserStats user3 = new UserStats("l");
		UserStats user4 = new UserStats("t");
		UserStats user5 = new UserStats("a");
		
		//add 3 logins to p
		user1.incrementLoginsAmount();
		user1.incrementLoginsAmount();
		user1.incrementLoginsAmount();
		
		//add 1 login to m
		user2.incrementLoginsAmount();
		
		//add 2 logins to l
		user3.incrementLoginsAmount();
		user3.incrementLoginsAmount();
		
		//no logins for t yet!
		//add 1 year to t
		user4.incrementAgeAmount();
		
		//add 5 logins to a
		user5.incrementLoginsAmount();
		user5.incrementLoginsAmount();
		user5.incrementLoginsAmount();
		user5.incrementLoginsAmount();
		user5.incrementLoginsAmount();
		
		HashMap statsMap = new HashMap<String, UserStats>();
		statsMap.put(user1.getUsername(), user1);
		statsMap.put(user2.getUsername(), user2);
		statsMap.put(user3.getUsername(), user3);
		statsMap.put(user4.getUsername(), user4);
		statsMap.put(user5.getUsername(), user5);
		
		Collection col = statsMap.values();
		Iterator iter = col.iterator();
		while(iter.hasNext()) {
			UserStats test = (UserStats) iter.next();
			System.out.println("USERNAME: "+test.getUsername()+" LOGiNS: "+test.getLoginsAmount());
		}
		
		  
	}
}

Code:
	public class UserStats {
		
		private String username;
		private Integer logins;
		private Integer age;
		
		public UserStats(String username) {
			this.username = username;
			logins = 0;
			age = 0;
		}
		
		public int getLoginsAmount() { return logins; }
		public int getAgeAmount() { return age; }
		public String getUsername() { return username; }
		
		public void incrementLoginsAmount() { logins++; }
		public void incrementAgeAmount() { age++; }
		
	}

Später sollen noch mehr Infos in die UserStats Klasse, zB. int bans etc.

In der main() iteriere ich durch die Collection die ich mit statsMap.values() bekomme, aber wie sortiere ich jetzt zB. danach, welcher User die meisten Logins hat?

Ich will quasi zum Ende sowas wie 'Today's most logins by <username>, he logged in XX times, followed by <username> with NN logins!'

Hat vll. jemand einen Tipp oder ein kleines Beispielprogramm, wie ich die UserStats() am besten auf/absteigend sortieren kann?

Gruß
 
Hallo,

wenn du unbedingt eine Map verwenden musst, so kannst du dir davon die values() geben lassen und diese in ein SortedSet (TreeSet) stecken. Hast du dem TreeSet einen entsprechenden Comparator mitgegeben kannst du die Aufgabe ganz leicht erfüllen siehe:

Java:
package de.tutorials;

import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;

public class SortedMapExample {

	public static void main(String[] args) {
		Comparator<UserStats> loginCountComparator = new Comparator<UserStats>() {
			@Override
			public int compare(UserStats first, UserStats second) {
				return first.logins - second.logins;
			}
		};

		SortedSet<UserStats> stats = new TreeSet<SortedMapExample.UserStats>(loginCountComparator);

		stats.add(new UserStats("A", 32));
		stats.add(new UserStats("B", 99));
		stats.add(new UserStats("C", 44));

		System.out.println(stats.first());
		System.out.println(stats.last());
	}

	public static class UserStats {
		String username;
		int logins;

		public UserStats(String username, int logins) {
			this.username = username;
			this.logins = logins;
		}

		@Override
		public String toString() {
			return String.format("UserStats [username=%s, logins=%s]",	username, logins);
		}
	}
}

Gruß Tom
 
Zurück