Modellieren Haareschneiden

zDieTaschenlampe

Aktives Mitglied
Guten Abend ihr Lieben,
es schämt mich, dass ich mich hier melden muss, aber es geht nicht mehr. Ich google seit Tagen schon nur rum, les Literatur, aber ich komme bei der (eigentlich einfachen) Aufgabe nicht voran bzw mir fehlt die Vorstellungskraft oder Basis zur Umsetzung. Ich hatte allgemein schon inhaltliche Schwierigkeiten bei der Aufgabe, aber diese haben sich gelichtet. Im Prinzip geht es um ein Friseursalon und um die Frage wie die Kunden auf die Friseure verteilt werden (genaue Details unten zsmgefasst). Also die erste Zahl die über die Kommandozeile mitgegeben wird ist die Anzahl der Friseure, die 2. ist mein Platz in der Schlange und die letzten Zahlen sind die Minuten, die der jeweilige Friseur braucht. Aber kann mir bitte irgendwer zeigen/erklären wie die Grundidee/Grundstruktur des Programms aussehen? Mir ist einfach nicht klar, wie das auszusehen hat. Weil unten im Beispieldurchlauf sieht man, dass bei 2 Friseuren es insgesamt 5 Zahlen gibt, die der Kommandozeile mitgegeben werden ( 2 Friseure Mein Platz und die Dauer in Minuten jeweils für die 2 Friseure) , aber bei 3 Friseuren sind es dann 6 Zahlen , die über die Kommandozeile mitgegeben werden? Wie ist das bitte umzusetzen im Programm? Ich wäre wirklich wirklich dankbar, wenn mir jemand einen groben Aufbau von dem ganzen als Input zeigen könnte.


Hier die Infos für die Modellierung:
Sie stehen in einer langen Schlange, um einen Haarschnitt in einem Friseursalon zu bekommen. Der Salon hat B Friseure im Dienst, welche von 1 bis B durchnummeriert sind. Der k te Friseur braucht immer genau Mk Minuten, um einem Kunden die Haare zu schneiden. Ein Friseur kann gleichzeitig nur einem Kunden die Haare schneiden, sobald ein Friseur die Haare des Kunden fertig geschnitten hat, schneidet er sofort die Haare des nächsten Kunden.

Solange der Friseursalon geöffnet ist, geht der Kunde, welcher an der Spitze der Schlange steht, immer zum Friseur mit der niedrigsten Nummer, der verfügbar ist. Wenn kein Friseur verfügbar ist, wartet dieser Kunde, bis mindestens einer verfügbar ist. Sie sind die n te Person in der Warteschlange, und der Friseursalon hat gerade geöffnet. Welcher Friseur wird Ihnen die Haare schneiden?

Um diese Frage beantworten zu können, nimmt Ihr Programm mehre natürliche Zahlen als Kommandozeilenparameter entgegen und gibt das Ergebnis wieder auf die Kommandozeile aus. Sie können davon ausgehen, dass die eingegebenen Parameter immer dem hier vorgegebenen Format entsprechen. Setzen Sie nur die in der Aufgabenstellung angegebenen Informationen um. Die erste Zahl ist die Anzahl der Friseure B (1<=B<=1000) und die zweite Zahl ist Ihr Platz in der Warteschlange N (1<=N<=10^9). Der Kunde am Anfang der Schlange hat den Platz mit der Nummer 1, der nächste ist Nummer 2 und so weiter. Die nachfolgenden Zahlen sind M1 M2 M3 .. Mk
Sobald das Ergebnis dieser Eingabe feststeht, wird die Nummer des Friseurs, der Ihnen die Haare schneiden wird, über den standardmäßigen Ausgabe-Stream auf die Kommandozeile ausgegeben. Danach beendet sich Ihr Programm regulär.

Eine Beispieleingabe des Programms sieht so aus :

> java Haircut 2 4 10 5
1
> java Haircut 3 12 7 7 7
3
> java Haircut 3 8 4 2 1
1

Also ich weiß net ob die Aufgabe für euch direkt klar ist, aber beim Beispiel 1 bedeutet es einfach, dass ich an Platz 4 in der Warteschlange sitze bei 2 Friseuren, die ein mal 10 und 5 Minuten brauchen. Kunde 1 geht also zu Friseur 1 und braucht 10 minuten. Währenddessen macht Friseur 2 Kunde 2 und 3, da dieser nur 5 Minuten braucht. Also bin ich (Platz 4 in der Schlange) wieder beim 1. Friseur. Allein um das zu verstehen hab ich tage gebraucht. Deswegen wäre um jegliche Hilfe dankbar
 
K

kneitzel

Gast
- Kannst Du für jeden Friseur aufstellen, wann dieser einen neuen Kunden ran nimmt?
- Kannst Du Werte sortieren?

Dann solltest Du einmal überlegen, wie Du das zusammen dazu verwenden könntest, um eine Lösung zu finden.
 

MoxxiManagarm

Top Contributor
Du solltest erst einmal versuchen das Problem zu modellieren. Was hast du...

In erster Linie brauchst du einen Friseur. Dieser Friseur hat 3 Attribute: Nummer, Generell benötigte Zeit, Restzeit des aktuellen Schnitts

Dann hast du eine Warteschlange. Letztlich willst du wissen wann die Warteschlange bis zu deiner Position leer ist. Man kann abstrakt annehmen, dass du der letzte in der Warteschlange bist. Du kannst das abbilden, indem du einfach die Position hochzählst und sie mit deiner Position abgleichst.

Dein erster Schritt muss es also sein eine Sammlung von Friseur Objekten zu erzeugen.

Dann gibt es verschiedene Möglichkeiten.

1) Dann hast du eine Schleife, welche so lange läuft bis n erreicht ist. Eine Iteration der Schleife ist eine Minute. Die Restzeit eines Friseurs wird in jeder Iteration dekrementiert. Wenn du 0 erreichst hast wird die Zeit zurückgesetzt und ein neuer Kunde zugewiesen, also der Zähler erhöht. Falls der erhöhte Zähler deiner Position entspricht wird die Nummer des Friseurs ausgegeben und das Programm beendet. Hier reicht eine einfache Liste oder Array für die Friseure.
2) Du kannst die Liste der Friseure nach Restzeit sortieren. In jeder Iteration (entspricht hier nicht einer Minute) wird der Friseur mit der geringsten Restzeit betrachtet. Allen Friseuren wird seine Restzeit abgezogen. Diesem "vordersten" Friseur wird die Restzeit dann zurückgesetzt und er muss neu in die sortierte Friseur-Liste eingefügt werden. Für diese Implementierung würde sich eine PriorityQueue eignen.
3) Es gibt sicherlich auch irgendwelche Mathematischen Ansätze :D
4) ...
 

MoxxiManagarm

Top Contributor
Ich denke, dass tendenziell die Erwartungshaltung von deinem Prof Variante 1 ist. PriorityQueue wäre nicht stabil, außer man sortiert zweitranging auch nach der Nummer. Die Ergebnisse von deiner soll-Darstellung erfordert aber eine stabile Reihenfolge.
 

Jangste

Mitglied
@MoxxiManagarm Das Verfahren schimpft sich auch Multilevel Feedback Queue oder Round Robin (beide FIFOs). Nicht stabile Sortierverfahren sind mir in Java gar nicht bekannt... Wie kommst du denn zu so einer Annahme?
 

zDieTaschenlampe

Aktives Mitglied
Ich bedanke mich erstmal für die Inputs und ich denke ein teil ist mir jetzt klarer geworden, aber ich sollte noch erwähnen, dass diese Aufgabe nur mit java.lang zu machen ist (alos nur java.lang ist erlaubt). Deswegen sind so Sachen wie Arrays, Listen etc die aus dem util Paket kommen keine Option :/
Also ich denk mal ich muss es mit Kontrollstrukturen gelöst bekommen, sprich If und for schleifen?
 

MoxxiManagarm

Top Contributor
Wie kommst du denn zu so einer Annahme?
Ich habe es ausprobiert. Vielleicht war Stabilität nicht das richtige Wort. Jedenfalls war das Ergebnis nicht das erwartete, wenn es mehrere Frieure gab, die gleichzeitig fertig wurden. Der Friseur mit Nummer 1 wird immer zuerst genommen, wenn es noch einen Friseur in der gleichen Minute gibt. Beim insert in die PriorityQueue war das nicht unbedingt gewährleistet, wenn nicht auch auf die Nummer explizit sortiert wird.

java.lang zu machen ist (alos nur java.lang ist erlaubt). Deswegen sind so Sachen wie Arrays, Listen etc die aus dem util Paket kommen keine Option :/
Wieso ist ein Array dann keine Option??
 

zDieTaschenlampe

Aktives Mitglied
Ich habe es ausprobiert. Vielleicht war Stabilität nicht das richtige Wort. Jedenfalls war das Ergebnis nicht das erwartete, wenn es mehrere Frieure gab, die gleichzeitig fertig wurden. Der Friseur mit Nummer 1 wird immer zuerst genommen, wenn es noch einen Friseur in der gleichen Minute gibt. Beim insert in die PriorityQueue war das nicht unbedingt gewährleistet, wenn nicht auch auf die Nummer explizit sortiert wird.


Wieso ist ein Array dann keine Option??
Ich habs falsch formuliert. Ein Array an sich ist erlaubt, aber wenn es um die Arrayklasse geht (inklusive seine Funktion) ist das nicht erlaubt, da das aus dem util Paket kommt
 

Meniskusschaden

Top Contributor
Ich habe es ausprobiert. Vielleicht war Stabilität nicht das richtige Wort. Jedenfalls war das Ergebnis nicht das erwartete, wenn es mehrere Frieure gab, die gleichzeitig fertig wurden.
Ich finde den Begriff eigentlich schon passend dafür und laut diesem Ausschnitt der Dokumentation wird tatsächlich keine Stabilität (oder was immer der bessere Begriff sein mag) garantiert:
The head of this queue is the least element with respect to the specified ordering. If multiple elements are tied for least value, the head is one of those elements -- ties are broken arbitrarily. The queue retrieval operations poll, remove, peek, and element access the element at the head of the queue.
 

MoxxiManagarm

Top Contributor
Letztlich ist es ja egal, die erwartete Implementierung wird vermutlich auf die Variante 1 mit Arrays hinauslaufen. Also eine unbestimmte Anzahl Iterationen (Minuten), die zyklisch die Restzeit einer Sitzung dekrementieren (und ggf. resetten) bis n Friseure einen Haarschnitt begonnen haben. Das Friseur Objekt braucht für diese Variante auch keine Nummer, denn die Nummer kann über den Index abgebildet werden. Das Friseur-Objekt kennt aber die benötigte Zeit des Friseurs und die Restzeit der aktuellen Sitzung des Friseurs. Theoretisch geht es auch ohne ein zusätzliches Friseurobjekt, objektorientiert wäre das aber nicht.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Also wozu Restzeit und so? Für diese Aufgabe ist das alles Overkill finde ich.

Man kann Elemente bauen aus Minute / Friseur. Und dann baut man einfach eine Nummer von Elementen auf:
Friseur1 / 0
Friseur1 / x1
Friseur1 / 2*x1
Friseur1 / 3*x1
...

Friseur2 / 0
Friseur2 / x2
Friseur2 / 2*x2
...

Wobei x1 die Zeit pro Kunde bei Friseur 1 ist.

Diese Liste kann man dann einfach sortieren nach der Zeit + Friseur als zweites Merkmal.
Und der nte Kunde ist dann das nte Element.

Jetzt ist die Frage, wie viele Element pro Friseur als Minimum aufgestellt werden müssen.
Worst case wäre, dass alle Friseure bis auf einen nur 1 Kunden annehmen (zum Zeitpunkt 0) und ein Friseur alle abarbeiten muss. Also bei Wartestelleposition n und k Friseuren wäre das n - k + 1 Elemente pro Friseur, die man berechnen sollte am Anfang.

Da muss man auch nicht "durchsimulieren", wann wer bei welchem Friseur dran kommt.Die Slots hat man schnell erstellt und sortiert und dann kann man das sofort ablsen, wer an welcher Position bei welchem Friseur dran kommt.
 

zDieTaschenlampe

Aktives Mitglied
Was ist mit Friseurobjekten gemeint bzw wie soll ich das verstehen? Also eine Klasse muss ja die Friseure sein und weiß glaub ich auch wie ich die mache, aber welche Klassen brauch ich dann noch?
Und wie stellt ihr euch die Warteschlange vor ?
 

MoxxiManagarm

Top Contributor
Was ist mit Friseurobjekten gemeint bzw wie soll ich das verstehen? Also eine Klasse muss ja die Friseure sein und weiß glaub ich auch wie ich die mache, aber welche Klassen brauch ich dann noch?
Und wie stellt ihr euch die Warteschlange vor ?
Das war so gemeint:
Java:
public static int whoCutsMe(int s, int n, int... times) {
    Friseur[] friseure = new Friseur[s];

    // Aufstellen der Friseure
    for (int i = 0; i < s; i++) {
        friseure[i] = new Friseur(times[i]);
    }
//...


class Friseur {
    private final int requiredTime;
    private int restTime;

    public Friseur(int requiredTime) {
        this.requiredTime = requiredTime;
    }
// ...
 

MoxxiManagarm

Top Contributor
Ganz einfach: Stabilität garantiert für ein Sortierverfahren die Behaltung der Reihenfolge gleicher Elemente.
Das meinte ich auch, gleich im Sinne der Restzeit. Die Aufgabe sieht, wenn man sich das erwartete Ergebnis anschaut, aber vor, dass stets der Friseur mit der niedrigeren Nummer zuerst den neuen Kunden annimmt, auch wenn ein anderer Friseur gleichzeitig fertig wird. Das ist bei der PriorityQueue einfach nicht der Fall gewesen, wenn der Comparator nicht auch die Nummer mit in Betracht gezogen hat. Fachlich gesehen wäre das eigentlich nicht falsch, es wäre legitim, schließlich sind beide Friseure wieder frei. z.B. bei dem Beispielfall mit 3 Friseuren, welche alle 3 7 Einheiten für den Schnitt benötigen. Das heißt sie alle stets gleichzeitig fertig. Dennoch ist festgelegt, dass der letzte Friseur der Richtige ist, weil eben die anderen 2 Friseure die niedrigere Nummer haben und daher "zuerst" wieder anfangen. Explizit in der Aufgabenstellung ist das nicht erwähnt, man sieht das nur anhand der Beispielausgabe.
 

zDieTaschenlampe

Aktives Mitglied
Das meinte ich auch, gleich im Sinne der Restzeit. Die Aufgabe sieht, wenn man sich das erwartete Ergebnis anschaut, aber vor, dass stets der Friseur mit der niedrigeren Nummer zuerst den neuen Kunden annimmt, auch wenn ein anderer Friseur gleichzeitig fertig wird. Das ist bei der PriorityQueue einfach nicht der Fall gewesen, wenn der Comparator nicht auch die Nummer mit in Betracht gezogen hat. Fachlich gesehen wäre das eigentlich nicht falsch, es wäre legitim, schließlich sind beide Friseure wieder frei. z.B. bei dem Beispielfall mit 3 Friseuren, welche alle 3 7 Einheiten für den Schnitt benötigen. Das heißt sie alle stets gleichzeitig fertig. Dennoch ist festgelegt, dass der letzte Friseur der Richtige ist, weil eben die anderen 2 Friseure die niedrigere Nummer haben und daher "zuerst" wieder anfangen. Explizit in der Aufgabenstellung ist das nicht erwähnt, man sieht das nur anhand der Beispielausgabe.

Doch es steht in der Aufgabe. Also immer der Friseure mit der kleinsten Nummer beginnt. Also hast du es richtig verstanden oder analysiert
 

zDieTaschenlampe

Aktives Mitglied
Das war so gemeint:
Java:
public static int whoCutsMe(int s, int n, int... times) {
    Friseur[] friseure = new Friseur[s];

    // Aufstellen der Friseure
    for (int i = 0; i < s; i++) {
        friseure[i] = new Friseur(times[i]);
    }
//...


class Friseur {
    private final int requiredTime;
    private int restTime;

    public Friseur(int requiredTime) {
        this.requiredTime = requiredTime;
    }
// ...

Ja also die Friseur Klasse habe ich genauso , aber ich versteh die erste Methode nicht. Stehen die parameter , die mitgegeben werden für die Schlange ? oder was ist mit s n und times gemeint ?

Also ich hab jetzt die Friseur Klasse, aber wo oder inwiefern integrier ich die jetzt mit dem Gesamtkonzept? Brauch ich noch einen Friseursalon oder weitere Klassen oder langt die eine ? Ich brauch doch mindestens noch eine main klasse, aber ich checks net. Ich check zwar eure Theoretischen Ausführungen, aber ich kriegs net hin das umzusetzen-_-
 

MoxxiManagarm

Top Contributor
s t und times sind einfach die parsed Werte von der Kommandozeile, in der Reihenfolge. s ist die Anzahl der Friseure, n die Position in der Warteschlange und times die Einheiten, die die Friseure benötigen.

Du brauchst für die Kundenwarteschlange keine weitere Queue implementieren, zumindest nicht für deinen Fall. Das n heißt einfach nur du bist die n-te Person die an die Reihe kommt. Du muss einfach nur mit dem Array von Friseuren arbeiten und dabei einen Zähler hochrechnen, der mit n abgeglichen wird.
 

zDieTaschenlampe

Aktives Mitglied
Also wozu Restzeit und so? Für diese Aufgabe ist das alles Overkill finde ich.

Man kann Elemente bauen aus Minute / Friseur. Und dann baut man einfach eine Nummer von Elementen auf:
Friseur1 / 0
Friseur1 / x1
Friseur1 / 2*x1
Friseur1 / 3*x1
...

Friseur2 / 0
Friseur2 / x2
Friseur2 / 2*x2
...

Wobei x1 die Zeit pro Kunde bei Friseur 1 ist.

Diese Liste kann man dann einfach sortieren nach der Zeit + Friseur als zweites Merkmal.
Und der nte Kunde ist dann das nte Element.

Jetzt ist die Frage, wie viele Element pro Friseur als Minimum aufgestellt werden müssen.
Worst case wäre, dass alle Friseure bis auf einen nur 1 Kunden annehmen (zum Zeitpunkt 0) und ein Friseur alle abarbeiten muss. Also bei Wartestelleposition n und k Friseuren wäre das n - k + 1 Elemente pro Friseur, die man berechnen sollte am Anfang.

Da muss man auch nicht "durchsimulieren", wann wer bei welchem Friseur dran kommt.Die Slots hat man schnell erstellt und sortiert und dann kann man das sofort ablsen, wer an welcher Position bei welchem Friseur dran kommt.

Könntest du mir code Schnipsel zeigen, weil ich check nicht was du mit slots meinst und wie das als code umsetzbar ist
 

zDieTaschenlampe

Aktives Mitglied
s t und times sind einfach die parsed Werte von der Kommandozeile, in der Reihenfolge. s ist die Anzahl der Friseure, n die Position in der Warteschlange und times die Einheiten, die die Friseure benötigen.

Du brauchst für die Kundenwarteschlange keine weitere Queue implementieren, zumindest nicht für deinen Fall. Das n heißt einfach nur du bist die n-te Person die an die Reihe kommt. Du muss einfach nur mit dem Array von Friseuren arbeiten und dabei einen Zähler hochrechnen, der mit n abgeglichen wird.

Aber in der Aufgabe steht ja nicht wie viel Kommandozeilenargumente kommen. Wie soll ich dann die methode machen? ich kann ja nicht einfach Pünktchen benutzen
 

MoxxiManagarm

Top Contributor
ich kann ja nicht einfach Pünktchen benutzen
Doch die Pünktchen sind legitim :D Aber du kannst gerne ein Array als Parameter hinsetzen, dann musst du aber auch ein Array übergebn. Die Pünktchen kamen aus meinem Test und der Aufruf dazu in der main sieht so aus:
Java:
public static void main(String... args) {
    System.out.println(whoCutsMe(2, 4, 10, 5));
    System.out.println(whoCutsMe(3, 12, 7, 7, 7));
    System.out.println(whoCutsMe(3, 8, 4, 2, 1));
}
(ich hatte in meinem Test auf Commando Zeile verzichtet)
 

Jangste

Mitglied
Mal ganz quick and dirty:
Java:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.IntStream;

public class Salon {
	private List<Friseur> friseure = new ArrayList<>();
	public Salon(int anzahlDerFriseure) {
		IntStream.range(0, anzahlDerFriseure).forEach(i -> friseure.add(new Friseur()));
	}
	public void enqueueKunde(int minuten) {
		friseure.stream().sorted(Comparator.comparingInt(Friseur::freiNach)).findFirst().get()
				.enqueue(new Auftrag(minuten));
	}
	public static void main(String[] args) {
		Salon salon = new Salon(3);
		ThreadLocalRandom.current().ints(10, 10, 21).forEach(salon::enqueueKunde);
		for (Friseur friseur : salon.friseure) {
			System.out.println(friseur);
		}
	}
}

class Friseur {
	private static char names = 'A';
	private String name = null;
	private List<Auftrag> aufträge = new ArrayList<>();
	public Friseur() {
		name = String.valueOf(names++);
	}
	public int freiNach() {
		return aufträge.stream().mapToInt(Auftrag::getMinuten).sum();
	}
	public void enqueue(Auftrag a) {
		aufträge.add(a);
	}
	@Override
	public String toString() {
		return String.format("Friseur [name=%s, aufträge=%s]", name, aufträge);
	}
}

class Auftrag {
	private static char nummern = 'a';
	private String nummer = null;
	private int minuten = -1;
	public Auftrag(int m) {
		minuten = m;
		nummer = String.valueOf(nummern++);
	}
	/**
	 * @return the minuten
	 */
	int getMinuten() {
		return minuten;
	}
	/**
	 * @param minuten the minuten to set
	 */
	void setMinuten(int minuten) {
		this.minuten = minuten;
	}
	@Override
	public String toString() {
		return String.format("Auftrag [nummer=%s, minuten=%s]", nummer, minuten);
	}
}
 

Jangste

Mitglied
Und die Ausgabe:
Code:
Friseur [name=A, aufträge=[Auftrag [nummer=a, minuten=17], Auftrag [nummer=f, minuten=12], Auftrag [nummer=h, minuten=11], Auftrag [nummer=j, minuten=12]]]
Friseur [name=B, aufträge=[Auftrag [nummer=b, minuten=15], Auftrag [nummer=e, minuten=11], Auftrag [nummer=g, minuten=16]]]
Friseur [name=C, aufträge=[Auftrag [nummer=c, minuten=10], Auftrag [nummer=d, minuten=20], Auftrag [nummer=i, minuten=15]]]

Edit
Bei 1-bis-2-Minuten-Intervallen sieht man es besser!
 

zDieTaschenlampe

Aktives Mitglied
Das war so gemeint:
Java:
public static int whoCutsMe(int s, int n, int... times) {
    Friseur[] friseure = new Friseur[s];

    // Aufstellen der Friseure
    for (int i = 0; i < s; i++) {
        friseure[i] = new Friseur(times[i]);
    }
//...


class Friseur {
    private final int requiredTime;
    private int restTime;

    public Friseur(int requiredTime) {
        this.requiredTime = requiredTime;
    }
// ...

Ich komme nicht zu einem Ziel -.- Zu welcher Klasse gehört denn deine whoCutsMe methode ? ich brauch doch meine Friseur Klasse und noch eine main Klasse, mit der main Methode, die ich Hair cut nennen werden. In Letzteres kommt doch dann deine Methode oder ? Und wozu gibst du deinem Friseur das 2. Attribut mit der RestTiem ? Also wozu brauch ich das.

Sorry dass ich mich jetzt erst wieder melde, aber gestern hatte ich andere Probleme in der Familie :(
 

MoxxiManagarm

Top Contributor
Zu welcher Klasse gehört denn deine whoCutsMe methode ?
Vergiss whoCutsMe, das war mein lokaler Test. Es ist einfach eine statische Methode bei mir lokal gewesen, die mit den int Parametern umgeht. Wie du das machst ist vollkommen dir überlassen.


Und wozu gibst du deinem Friseur das 2. Attribut mit der RestTiem
Das ist die Restzeit, die der Friseur zum Zeitpunkt x (Iterationsdurchlauf) noch für seinen aktuellen Haarschnitt benötigt.

aber gestern hatte ich andere Probleme in der Familie
Ohje, alles gute von mir was auch immer das war
 

MoxxiManagarm

Top Contributor
Was oder wen meinst du ?
Nicht dich. Ich meinte Jangste. Er ist ein älteres Forummitglied und hat sich mit mehreren Accounts durch Provokation bereits unbeliebt gemacht. Anscheinend werden durch die Provokation seine Accounts auch regelmäßig gesperrt, aber er lässt es nicht sein. Weil er eben mit dem Account Jangste auch wieder provoziert hat habe ich schnell gemerkt, dass er es ist. Und alle, die auf meine Frage reagiert haben, wissen das auch. Der Account Jangste war heute auch noch nicht online, möglicher Weise hats auch den wieder gesperrt.

Ich vermute auch, dass dich sein Beispiel eher verwirrt, als dass es dir hilft. Ignoriere es einfach.
 
Zuletzt bearbeitet:

MoxxiManagarm

Top Contributor
Hier nochmal die Schritte, welche du für meinen vorgeschlagenen Ansatz (Simulationsdurchlauf) mit Arrays benötigst:
1. Erstmal musst du die Kommandozeilen Parameter nach int parsen, du brauchst die Anzahl der Friseure (s: int), deine Qarteschlangenposition (n: int) und die generell benötigten Zeiten der Friseure (times: int[]). Die Benennung von s n und times ist dir überlassen.
2. Du baust ein s-großes Array von Friseuren, welchen du ihre Zeit bekanntmachst. Sie haben erstmal eine Restzeit von 0, schließlich habe sie noch keinen Haarschnitt begonnen.
3. Du initialisierst einen Zähler mit 0, welcher die Anzahl der angefangenen Haarschnitte darstellt
4. Du startest die Simulation mit einer Schleife. Erreicht die Restzeit eines Friseurs 0, dann wird seine Zeit zurückgesetzt und der Zähler um 1 erhöht. Für die Iteration hast du 2 verschiedene Möglichkeiten:
4a. Die jede Iteration ist eine Minute. Das heißt in jeder Iteration wird die Restzeit des Friseurs um 1 dekrementiert.
4b. In jeder Iteration suchst du das globale Minimum von Restzeit. Dieses globale Minimum wird von allen Friseuren abgezogen. Das kannst du dir so ähnlich wie einen Zeitraffer vorstellen.
5. Du musst immer, wenn der Zähler erhöht wurde diesen mit n vergleichen. Hast du n erreicht, so gibst du die Nummer des letzten Friseurs zurück, der einen Haarschnitt begonnen hat

FERTIG
 

zDieTaschenlampe

Aktives Mitglied
Hier nochmal die Schritte, welche du für meinen vorgeschlagenen Ansatz (Simulationsdurchlauf) mit Arrays benötigst:
1. Erstmal musst du die Kommandozeilen Parameter nach int parsen, du brauchst die Anzahl der Friseure (s: int), deine Qarteschlangenposition (n: int) und die generell benötigten Zeiten der Friseure (times: int[]). Die Benennung von s n und times ist dir überlassen.
2. Du baust ein s-großes Array von Friseuren, welchen du ihre Zeit bekanntmachst. Sie haben erstmal eine Restzeit von 0, schließlich habe sie noch keinen Haarschnitt begonnen.
3. Du initialisierst einen Zähler mit 0, welcher die Anzahl der angefangenen Haarschnitte darstellt
4. Du startest die Simulation mit einer Schleife. Erreicht die Restzeit eines Friseurs 0, dann wird seine Zeit zurückgesetzt und der Zähler um 1 erhöht. Für die Iteration hast du 2 verschiedene Möglichkeiten:
4a. Die jede Iteration ist eine Minute. Das heißt in jeder Iteration wird die Restzeit des Friseurs um 1 dekrementiert.
4b. In jeder Iteration suchst du das globale Minimum von Restzeit. Dieses globale Minimum wird von allen Friseuren abgezogen. Das kannst du dir so ähnlich wie einen Zeitraffer vorstellen.
5. Du musst immer, wenn der Zähler erhöht wurde diesen mit n vergleichen. Hast du n erreicht, so gibst du die Nummer des letzten Friseurs zurück, der einen Haarschnitt begonnen hat

FERTIG

Ersteinmal danke für alles. Und dein Vorgehen ist mir mehr oder weniger auch verständlich, aber an der Umsetzung scheitert es. Zu 1. Es muss nichts geparst werden, da in der Aufgabenstellung vorausgesetzt wird, dass die der Kommandozeile übergebenen Parameter dem entsprechenden Format entsprechen.

Das ist bisher mein Ansatz, aber es passt vorne und hinten nicht. Passieren deine Schritte 1 bis 5 alle innerhalb einer Methode oder was übersehe ich? oder innerhalb einer Klasse ? Weil die Sachen, die eingegeben werden müssen ja gespeichert werden, so dass ich darauf zugreifen kann.
Baue ich die Restzeit von 0 in den Konstruktor der Friseure ein?

Java:
public class Barber {
    private final int requiredTime;
    private int restTime;

    public Barber(int requiredTime) {
        this.requiredTime = requiredTime;
    }

    public int getRestTime() {
        return this.restTime;
    }

    public int getRequiredTime() {
        return this.requiredTime;
    }

    public int haircut(int s, int n, int[] times) {
        Barber[] friseure = new Barber[s]; // Anzahl der Friseure wird festgelegt

        for (int i = 1; i <= friseure.length; i++) {
            friseure[i] = new Barber(times[i]); // Hier werden die Frieseure und deren Zeiten aufgestellt
                                                // Aber die Zeiten werden ja jetzt nur innerhalb der Methode gespeichert
        }
    }
}
 

MoxxiManagarm

Top Contributor
Es muss nichts geparst werden, da in der Aufgabenstellung vorausgesetzt wird, dass die der Kommandozeile übergebenen Parameter dem entsprechenden Format entsprechen.
Doch klar, Kommandozeilenparameter sind Strings, die musst du schon in ints umwandeln! Das ist parsen.


Haircut ist keine Methode von Barber. Nimm die Raus, die muss in deine Haircut Klasse. Der Barber braucht aber noch eine Methode um die Restzeit zu reduzieren und eine Methode um die Restzeit wieder auf die benötigste Zeit zurückzusetzen, also quasi einen Haarschnitt zu starten.
 

zDieTaschenlampe

Aktives Mitglied
Doch klar, Kommandozeilenparameter sind Strings, die musst du schon in ints umwandeln! Das ist parsen
Oh stimmt ja, aber das ist kein Problem. Das kann ich und das ist das kleinste Problem xD

Code:
Integer.parseInt(args[0]), Integer.parseInt(args[1]), Integer.parseInt(args[2]). // Aber hier ist mir dann auch nicht klar wie ich mit den Zeiten umgehen soll. S und N sind ja einfach zu parsen, aber die Zeiten sind ja Arrays
 

MoxxiManagarm

Top Contributor
Das ganze ist eigentlich kein Problem, du musst nur mal das Brett vor deinem Kopf loswerden :D Aber das passiert öfter, dass man dieses Brett hat, zumindest als Anfänger. Bin mir nur unsicher, wie wir das am besten bei dir wegkriegen ^^
 

zDieTaschenlampe

Aktives Mitglied
Doch klar, Kommandozeilenparameter sind Strings, die musst du schon in ints umwandeln! Das ist parsen.

Haircut ist keine Methode von Barber. Nimm die Raus, die muss in deine Haircut Klasse. Der Barber braucht aber noch eine Methode um die Restzeit zu reduzieren und eine Methode um die Restzeit wieder auf die benötigste Zeit zurückzusetzen, also quasi einen Haarschnitt zu starten.
Ja okey das war schon mal Denkfehler Nummer 1. Bezüglich der 2 Methoden :

Code:
public void reduceRestTime(int resttime) {  // Hier bin ich mir nicht sicher, inwiefern die RestTime reduziert wird oder werden soll
        this.restTime =
    }
    
    public void resetRestTime() {  // Die Methode hier sollte eigentlich passen, da sobald die Restzeit auf 0 ist, diese ja auf die benötigte Zeit wieder gesetzt werden muss
        this.restTime = requiredTime;
    }
 

zDieTaschenlampe

Aktives Mitglied
ja resetRestTime passt. reduceRestTime sind für die Steps 4a bzw. 4b benötigt. bei 4a bräuchtest du keinen Parameter, sondern reduzierst die Restzeit um 1. Bei 4b würde dieser Parameter das globale Minimum sein.

Ahso hätte das schon erwähnen sollen, dass mir der Weg 4a sympathischer ist und ich diesen die ganze Zeit anpeile, aber damit wäre jetzt die Barber Klasse fertig i guess ?
 

Ähnliche Java Themen

Neue Themen


Oben