Hallo liebe Java-Peers,
Die Aufgabe lautet: 10000 Leute stehen durchnummeriert im Kreis. Nacheinander muss jeder Dritte gehen. Welche 2 Personen bleiben übrig?
Ich weiß...eigentlich kann man das alles mit einem einfachen Array lösen, aber ich habe mir vorgenommen es mit einer Map zu versuchen und bin massiv an meine Grenzen gestoßen.
Die Idee:
Der Key der Map ist eine feste Zahl, beginnend mit eins und hochgezählt - die ID der Person quasi. Der Value zählt ebenfalls hoch, wird aber nach jeder runde (wenn "durchgezählt" wurde) wieder neu gesetzt (bei z.b. 10 Leuten fängt No. 1 nach einer Runde nicht bei eins an zu zählen sonder sagt "zwei"). Aus der Map wird jeder Eintrag, der durch drei teibar ist, gelöscht.
Das Problem:
Die ersten beiden Runden funktionieren die Methoden, ab der dritten wird der Initialwert (ersterEintragValues) falsch gesetzt (nicht auf 3 sondern wieder auf eins, laut eclipse debugger).
Die Map:
Runde 1:
Runde 2: {1=1, 2=2, 4=3, 5=4, 7=5, 8=6, 10=7}
Runde 3: {1=1, 2=2, 5=4, 7=5, 10=7} --> da sollte mit {1=3, 2=4.....} stehen
Außerdem werden die Values nicht korrekt hochgezählt:
Runde 4: {1=2, 2=3, 5=5, 7=6, 10=7} --> da sollte, wenn schon, {1=2, 2=3, 5=3...} stehen.
Vielleicht hat jedamd den erleuchtenden Tipp
Es entsteht eine Endlosschleife bei map.size = 3 ...vermutlich weil er keine Values mehr findet, die durch drei teilbar sind. Ich geh den Code dur
Die Aufgabe lautet: 10000 Leute stehen durchnummeriert im Kreis. Nacheinander muss jeder Dritte gehen. Welche 2 Personen bleiben übrig?
Ich weiß...eigentlich kann man das alles mit einem einfachen Array lösen, aber ich habe mir vorgenommen es mit einer Map zu versuchen und bin massiv an meine Grenzen gestoßen.
Java:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Durchzaehlen {
public static void main(String[] args) {
// Initiierung der Map
Map<Integer, Integer> personenMap = new HashMap<Integer, Integer>();
for (Integer i = 1; i <= 10; i++) {
personenMap.put(i, i);
}
Integer ersterEintragValues = 1;
while (personenMap.size() >= 3) {
//drei Methoden s.u.
loescheAlleDreiSchritte(personenMap);
setzeKeysNeu(personenMap, ersterEintragValues);
ersterEintragValues = listeErsterFestlegen(personenMap);
/**
* Um zu sehen, wie groß die Map noch ist:
*/
System.out.println(personenMap.size());
}
System.out.println(personenMap);
}
// Methoden
/**
*
* @param personenMap Die Liste, in der Personen gespeichert sind, die
* hochzählen
*
* Die Methode löscht jeden dritten Eintrag mittels eines
* Iterators aus der Liste.
*
* @return Die Personenliste wird wieder ausgegeben
*
*/
public static Map<Integer, Integer> loescheAlleDreiSchritte(Map<Integer, Integer> personenMap) {
Iterator<Integer> iterator = personenMap.values().iterator();
while (iterator.hasNext()) {
Integer next = iterator.next();
if (next % 3 == 0) {
iterator.remove();
}
}
return personenMap;
}
/**
*
* @param personenMap
*
* @param counter setzt den value für personenMap am index 0 fest
*
* Die Methode setzt das valueSet neu. Erster Eintrag ist der
* counter, dann wird hochgezählt
*
* @return Die Liste mit den neuen Values
*
*/
public static Map<Integer, Integer> setzeKeysNeu(Map<Integer, Integer> personenMap, Integer counter) {
for (Integer key : personenMap.values()) {
if (key != null) {
personenMap.replace(key, counter);
}
counter++;
}
return personenMap;
}
/**
*
* @param map
*
* Legt den ersten Eintrag der Liste per Modulo fest. Bei 10 Personen
* im Kreis ist 10 % 3 = 1 in der nächsten Runde muss ab 2 gezählt
* werden, daher plus 1
*
* @return
*/
public static Integer listeErsterFestlegen(Map<Integer, Integer> map) {
Integer listeErster = (map.size() % 3) + 1;
return listeErster;
}
}
Die Idee:
Der Key der Map ist eine feste Zahl, beginnend mit eins und hochgezählt - die ID der Person quasi. Der Value zählt ebenfalls hoch, wird aber nach jeder runde (wenn "durchgezählt" wurde) wieder neu gesetzt (bei z.b. 10 Leuten fängt No. 1 nach einer Runde nicht bei eins an zu zählen sonder sagt "zwei"). Aus der Map wird jeder Eintrag, der durch drei teibar ist, gelöscht.
Das Problem:
Die ersten beiden Runden funktionieren die Methoden, ab der dritten wird der Initialwert (ersterEintragValues) falsch gesetzt (nicht auf 3 sondern wieder auf eins, laut eclipse debugger).
Die Map:
Runde 1:
Runde 2: {1=1, 2=2, 4=3, 5=4, 7=5, 8=6, 10=7}
Runde 3: {1=1, 2=2, 5=4, 7=5, 10=7} --> da sollte mit {1=3, 2=4.....} stehen
Außerdem werden die Values nicht korrekt hochgezählt:
Runde 4: {1=2, 2=3, 5=5, 7=6, 10=7} --> da sollte, wenn schon, {1=2, 2=3, 5=3...} stehen.
Vielleicht hat jedamd den erleuchtenden Tipp
Es entsteht eine Endlosschleife bei map.size = 3 ...vermutlich weil er keine Values mehr findet, die durch drei teilbar sind. Ich geh den Code dur