You are not logged in.

  • Login

[Java] MySQL top5

Bitte besucht unser neues Forum unter https://forum.nitrado.net | Please visit our new Forum at https://forum.nitrado.net

MyLubi

User / Kunde

  • "MyLubi" started this thread

Posts: 154

  • Send private message

1

Thursday, June 22nd 2017, 9:06pm

MySQL top5

Hey ich komm grad echt nicht weiter.. beim /top befehl sollten die top 5 spieler nach kills aufgelistet werden aber irgendwie werden zwar die spieler aufgelistet aber nicht nach der reihe..

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
	public void sendKT(Player p) {

		List<String> sortedList = new ArrayList<>();

		Map<String, Integer> map = sortByValue(SQL.top5);

		for (String s : map.keySet()) {
			sortedList.add(s);
		}

		for (int i = 0; (i < 5) && (i < sortedList.size()); i++) {
			if (sortedList.get(i) != null) {
				p.sendMessage("" + (i + 1) + " " + sortedList.get(i) + " " + map.get(sortedList.get(i)));
			}
		}
	}

	public <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));
	}

Stuppsman

User / Kunde

Posts: 2,766

Thanks: 25

  • Send private message

2

Thursday, June 22nd 2017, 11:14pm

MySQL sortiert dir das einfach im Query.. Lass dir einfach das ResultSet ausgeben, dann musst du da nicht so rumhampeln:

SELECT name, kills FROM table ORDER BY kills DESC LIMIT 5
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

MyLubi

User / Kunde

  • "MyLubi" started this thread

Posts: 154

  • Send private message

3

Friday, June 23rd 2017, 2:45pm

Hab ich ja also ich habe ne Methode die die Spieler in die HashMap top5 setzt. Die Methode ruf ich im onEnable teil auf

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
	public static void setRanking() {
		ResultSet rs = MySQL.getResult("SELECT UUID FROM UHCFFA ORDER BY KILLS DESC LIMIT 5");
		
		int i = 0;
		
		try {
			while(rs.next()) {
				i++;
				top5.put(rs.getString("UUID"), i);
			}
		} catch(SQLException ex) {
			ex.printStackTrace();
		}
	}

Stuppsman

User / Kunde

Posts: 2,766

Thanks: 25

  • Send private message

4

Friday, June 23rd 2017, 3:35pm

Hm? Macht doch keinen Sinn, das im onEnable zu laden, sind doch live-Daten. Ich würd einfach in dem Moment, in dem du das ausgeben willst, den Query abschicken und ausgeben, ohne da mit ner static-Methode und ner sortedList rumhampeln zu müssen. Machs asynchron, wenn die Tabelle zu groß ist, es also etwas dauern könnte, aber bei nem normalen Spielserver sollt die Geschwindigkeit eigentlich reichen.
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

MyLubi

User / Kunde

  • "MyLubi" started this thread

Posts: 154

  • Send private message

5

Friday, June 23rd 2017, 3:40pm

d.h soll ich den Spieler beim joinen mit dieser Methode in die top5 hashmap speichern?

Stuppsman

User / Kunde

Posts: 2,766

Thanks: 25

  • Send private message

6

Tuesday, June 27th 2017, 2:18pm

Wieso unbedingt in ne Hashmap und wieso unbedingt zwischenspeichern? Wenn ein Scoreboard mit den Daten gefüllt wird, würd ichs verstehen, aber wenns um nen Befehl geht, der die Top5 ausgibt, kannst du dir das direkt aus der Datenbank holen. Wofür benutzt du das Ranking denn?
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

RaysException

User / Kunde

Posts: 74

  • Send private message

7

Wednesday, June 28th 2017, 11:51am

Hier, sollte eigentlich so funktioniere. Ist aber ungetestet. Musst deine Values eintrage. Ist dir hoffentlich klar.

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
	public HashMap<Integer, String> top5 = new HashMap<>();
	
	public void getTop5(Player p) {
		try {
			ResultSet r = Instance.getMySQL().getResultSet("SELECT UUID FROM STATS WHERE Kills != 0 ORDER BY Kills DESC LIMIT 5");
			Integer i = Integer.valueOf(0);
			while(r.next()) {
				i = Integer.valueOf(i + 1);
				top5.put(i, r.getString("UUID"));
			}
			if((i.intValue() >= 5) || (i.intValue() == 5)) {
				p.sendMessage("1. Platz | " + (String)top5.get(Integer.valueOf(0)));
				p.sendMessage("2. Platz | " + (String)top5.get(Integer.valueOf(1)));
				p.sendMessage("3. Platz | " + (String)top5.get(Integer.valueOf(2)));
				p.sendMessage("4. Platz | " + (String)top5.get(Integer.valueOf(3)));
				p.sendMessage("5. Platz | " + (String)top5.get(Integer.valueOf(4)));
			} else {
				p.sendMessage("Es haben noch nicht genug Leute gespielt.");
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

MyLubi

User / Kunde

  • "MyLubi" started this thread

Posts: 154

  • Send private message

8

Wednesday, June 28th 2017, 2:22pm

ok danke dir <3

Stuppsman

User / Kunde

Posts: 2,766

Thanks: 25

  • Send private message

9

Friday, June 30th 2017, 1:23am

@RaysException

Hat das nen Sinn, wieso du die Klasse Integer statt des primitiven Datentyps benutzt?


und bei if((i.intValue() >= 5) || (i.intValue() == 5)) { kannst du dir die hintere Hälfte sparen, ist im ersten doch abgedeckt.. ^^
Nein, ich hab kein Skype.. bei Interesse an einer privaten Unterrichtsstunde, wende dich bitte direkt an mein Team! 8)

jamawie

User / Kunde

Posts: 43

  • Send private message

10

Friday, June 30th 2017, 8:55am

Zudem würde ich gerne nochmal die Frage von Stuppsman aufwerfen... Warum das alles Zwischenspeichern und immerwieder die kompletten Daten auswerten um dann doch nur die 5 zu behalten? Aus meinen Augen und aus Sicht der Performance macht das absolut keinen Sinn. Zumindest kann ich keinen erkennen...

Kannst du das bitte nochmal erläutern, sodass auch ich das verstehe?


Mit freundlichen Grüßen

jamawie

Bitte besucht unser neues Forum unter https://forum.nitrado.net| Please visit our new Forum at https://forum.nitrado.net

Similar threads