Test auf Dopplungen

Hey liebe Forenmitglieder ,
ich steh vor der Aufgabe die wie folgt lautet:

Man soll aus einer Eingabe x(<=1000) , x Zeilen folgen lassen , welche mindestens 2 Wörter und max.1000 Zeichen besitzen.
Wobei das erste Worte ein Name darstellt und die weiteren Wörter Pizzabeläge.
Wenn 2 Namen die selben Pizzabeläge favorisieren können die sich quasi eine teilen.
Also folgendes Beispiel:
x=5
Michael Mais Käse Schinken
Andi Paprika Mais Salami
Sandra Sahne Schinken Käse
Sonja Mais Käse Schinken
Chris Mais Käse Schinken
Daraus sollte das Programm die Anzahl der verschiedenen Pizzen ausgeben.In diesem Fall also 3.(Hoffe ist verständlicho_O)
Nun zu meinen Code
Java:
import java.util.Scanner;
public class Pizzabelag {
public static void main(String[]args) {
    Scanner sc=new Scanner(System.in);
    int n=sc.nextInt();
    
    if(n<=1000) {
        for(int i=0;i<=n;i++) {
            String text=sc.nextLine();
            String a=new String(text);
            while(a.length()>=1 && a.length()<=1000) {
                    //????
                
            }
        }
        
    }
}
}

Ich glaube es bis zur Eingabe der einzelnen Worte hinbekommen zu haben.Nun weiß ich leider nicht wie ich es auf Gleichheit prüfen soll. :/
Für Ideen & Tipps wäre ich sehr dankbar. :):)
 

Tarrew

Top Contributor
Am besten speicherst du deine Daten erstmal in irgendeiner objektorientierten Struktur.
(Was soll überhaupt dein String "a" und die while-Schleife darunter machen? Die erscheinen mir ziemlich sinnlos).

Also, deine Pizzen könnte man so speichern:
Java:
public class Test {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine();

        List<Pizza> pizzas = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            String[] sPizza = sc.nextLine().split(" ");
            pizzas.add(new Pizza(sPizza[0], Set.of(Arrays.copyOfRange(sPizza, 1, sPizza.length))));
        }

        System.out.println(pizzas);
    }

}

class Pizza {
    private String customer;
    private Set<String> toppings; //Jedes Topping nur 1x erlaubt in diesem Beispiel, Reihenfolge der Toppings spielt keine Rolle

    public Pizza(String customer, Set<String> toppings) {
        this.customer = customer;
        this.toppings = toppings;
    }

    public String getCustomer() {
        return customer;
    }

    public void setCustomer(String customer) {
        this.customer = customer;
    }

    public Set<String> getToppings() {
        return toppings;
    }

    public void setToppings(Set<String> toppings) {
        this.toppings = toppings;
    }

    @Override
    public String toString() {
        return "Pizza{" +
                "customer='" + customer + '\'' +
                ", toppings=" + toppings +
                '}';
    }
}

Und jetzt überlegst du dir wie man Objekte auf Gleichheit überprüft. Und wie macht man das? Richtig, mit der equals-Methode. Wenn du die equals-Methode der Klasse "Pizza" schlau überschreibst und das mit einem Set verbindest (lies dir mal die Eigenschaften eines Set's durch, falls du die nicht kennst), dann kommst du schnell an deine Lösung ;)
 
X

Xyz1

Gast
x=5 kannst Du ja schon einlesen, also fehlt noch:
Java:
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Objects;
import java.util.Random;

public class Pizza {
    HashMap<Integer, LinkedList<Integer>> BelagPersonenCombo = new HashMap<>();

    void add(Random r) {
        int z1 = r.nextInt(Belag.values().length);
        int z2 = r.nextInt(Belag.values().length);
        if (z1 > z2) {
            int i = z1;
            z1 = z2;
            z2 = i;
        }
        int k = Objects.hash(z1, z2);
        int v = r.nextInt(Person.values().length);
        if (BelagPersonenCombo.containsKey(k)) {
            BelagPersonenCombo.get(k).add(v);
        } else {
            BelagPersonenCombo.put(k, new LinkedList<>(Arrays.asList(z1, z2, v)));
        }
    }

    public static void main(String[] args) {
        int n = 5;
        Random r = new Random(16);
        Pizza pizza = new Pizza();
        for (int i = 0; i < n; i++) {
            pizza.add(r);
        }

        for (LinkedList<Integer> l : pizza.BelagPersonenCombo.values()) {
            System.out.println("Folgende Personen essen gerne " + Belag.values()[l.get(0)] + " und " + Belag.values()[l.get(1)] + ":");
            for (Integer i : l.subList(2, l.size())) {
                System.out.println(Person.values()[i]);
            }
            System.out.println();
        }
    }
}

enum Person {
    Michael, Andi, Sandra, Sonja, Chris, Tobias, Foo, Bar, Baz
}

enum Belag {
    Mais, Käse, Schinken, Salami, Sahne, Brokkoli, Bolognese, Artischocken, Mozarella, Zwiebel, Paprika, Lauch
}

(Ich habe Mozarella falschgeschrieben :mad:)
 

httpdigest

Top Contributor
Daraus sollte das Programm die Anzahl der verschiedenen Pizzen ausgeben.In diesem Fall also 3.
Falls nur die Anzahl gewünscht ist, dann:
Java:
public class Pizza {
  private static long anzahlVerschiedenerPizzen(
      java.util.stream.Stream<java.util.stream.Stream<String>> belaege) {
    return belaege
      .map(s -> s.map(String::toLowerCase)
                 .sorted()
                 .collect(java.util.stream.Collectors.joining()))
      .distinct()
      .count();
  }
  private static java.util.stream.Stream<java.util.stream.Stream<String>>
                 pizzaBestellungen(java.util.Scanner sc) {
    return java.util.stream.IntStream
      .range(0, Integer.parseInt(sc.nextLine()))
      .mapToObj(__ -> sc.nextLine())
      .map(line -> line.split("\\s+"))
      .map(words -> java.util.Arrays.stream(words).skip(1));
  }
  public static void main(String[] args) {
    java.util.Scanner sc = new java.util.Scanner(System.in);
    long anzahl = anzahlVerschiedenerPizzen(pizzaBestellungen(sc));
    sc.close();
    System.out.println("Anzahl unterschiedlicher Pizzen: " + anzahl);
  }
}
 
X

Xyz1

Gast
Ach Mist, da können Hash-Kollisionen auftreten, die dann dazu führen, dass eine Person eine Pizza bekommt, die sie gar nicht mag - oder eine Person kann zB auch als Belag zweimal Lauch bekommen... :(
 

White_Fox

Top Contributor
Ich glaub ich hab ihn mit meiner Problembeschreibung im Nachbarforum zu sehr beschäftigt. Wenn ich so drüber nachdenk: Ich weiß gar nicht ob ich nüchtern war als ich mir das ausgedacht habe...
 

Der Wissende

Mitglied
(Ich habe Mozarella falschgeschrieben :mad:)
Und auch die Aufgabe falsch verstanden... Es sollen n Zeilen eingelesen werden die aus PERSON und BELAG+ bestehen. Dann soll geschaut werden wie viele verschiedene Pizzen es gibt.
Du generierst Random Pizzen mit 2 verschiedenen Zutaten, packst sie in eine Map mit Personen, und gibst sie dann aus.

@httpdigest hat ja schon eine Lösung mit Streams geschrieben, die super ist. Hier nochmal eine anfängerfreundlichere:
Java:
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Pizza {

  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    
    int anzahl = sc.nextInt();
    sc.nextLine();
    
    //Hier speichern wir die Pizzen als Set, sollen ja keine doppelten vorkommen
    Set<Set<String>> pizzen = new HashSet<>();
    
    for(int i=0;i<anzahl;i++) {
      String line = sc.nextLine();
      //Zeile in einzelne Wörter zerteilen
      String[] splitted = line.split(" ");
      //Das erste Wort ist der Name, uns interessiert nur das was danach kommt
      String[] toppings = Arrays.copyOfRange(splitted, 1, splitted.length);
      //Da doppelte Zutaten nicht erlaubt sein sollten und auch die Reihenfolge egal ist, packen wir die Zutaten in ein Set
      HashSet<String> toppingsAsSet = new HashSet<>(Arrays.asList(toppings));
      //Dann fügen wir die Zutaten den Pizzen hinzu
      pizzen.add(toppingsAsSet);
    }
    // In den Pizzen stehen jetzt nur noch die Zutaten, die einfach vorkommen. Daher ist die Lösung einfach die größe des Sets
    System.out.print(pizzen.size());
  }
}
 
X

Xyz1

Gast
Oder eben rein mathematisch:
Java:
public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	System.out.println("Wie viele Beläge gibt es?");
	int n1 = sc.nextInt();
	System.out.println("Wie viele Beläge gibt es pro Pizza?");
	int n2 = sc.nextInt();
	System.out.println("Wie viele Personen gibt es?");
	int n3 = sc.nextInt();
	long n4 = fac(n1) / (fac(n1 - n2) * fac(n2));
	System.out.println("Es gibt " + n4 + " mögliche Pizzen.");
	double n5 = (1.0 - (Math.pow(1.0 / n4, n3) * n4)) * 100.0;
	System.out.println("Mit einer Wahrscheinlichkeit von " + (float) n5 + " mögen zwei Personen die gleiche Pizza.");
}

public static long fac(int i) {
	long l = 1;
	while (i > 0) {
		l *= i--;
	}
	return l;
}

(n5 könnte falsch sein...)
 

Der Wissende

Mitglied
Das erscheint mir ziemlich unsinnig.
Bei dir wäre ich gern mal auf einer Party eingeladen.
Alle anderen so: "He ich hab da einen Zettel liegen schreibt doch mal alle drauf auf was für eine Pizza ihr Bock habt." bisschen später "ah okay ich bestell dann mal 10 verschiedene Pizzen"
Du: "schön das ihr alle gekommen seid, ich hab mal Pizza bestellt, ich hab berechnet, dass mit einer Wahrscheinlichkeit von 30% hat jemand Lust auf Käse mit Mozzarella und Sahne hat"


weißt Du zufällig was hieran falsch ist?
Du meinst neben der Themenverfehlung?

Also wir stellen uns jetzt einfach mal vor das wir auf der Party von @Tobias-nrw sind und Tobias hat jetzt mal was vorbereitet. Er hat festgelegt, dass es 10 verschiedene Zutaten für Pizza gibt und das jede Pizza genau 3 Zutaten haben darf. Also gibt es keine Margarita und keine quattro Formaggi.
Da er ja ein Fuchs ist bestellt er nun mal alle 120 möglichen Pizzen. Jetzt kommen seine Freunde DerWissende, horstiii und horstiii2. Jeder darf sich eine Pizza aussuchen. Die Wahrscheinlichkeit das sich jemand die Käse-Morzzarella-Sahne Pizza aussucht liegt bei 1/120. Dass sich 2 Leute die gleiche Pizza aussuchen liegt bei (1/120 * 1/120) und dass sich dann n Leute die gleiche Pizza aussuchen liegt bei 1/120 ^ n. Dass jetzt genau 2 Leute die gleiche Pizza wollen liegt bei (1/120)^Anzahl der möglichen Paare. Also in unserem Fall (1/120)^((3!/((3-2)!*2!)) = 5,78703704 × 10^-7
 

mihe7

Top Contributor
Es gibt b Beläge und p Beläge/Pizza (Pizzabelag). Wie viele Möglichkeiten m gibt es, p Pizzabeläge aus b Belägen auszuwählen? m = b!/(p!*(b-p)!)

Die Anzahl an Kombinationen von n Personen und Pizzen ist also m^n.

Wie hoch ist die Wahrscheinlichkeit, dass sich z. B. 2 Personen unterschiedliche Pizzen aussuchen? Naja, die erste Person hat m Möglichkeiten, für die zweite bleiben dann noch m-1 übrig usw. Für n Personen gilt also u(m,n) = m(m-1)*...(m-n+1)

Die Wahrscheinlichkeit, dass die von n Personen ausgewählten Pizzen unterschiedlich sind, beträgt: Pv = u(m,n)/(m^n). D. h. die Wahrscheinlichkeit, dass wenigstens zwei Personen die gleiche Pizza wählen, liegt bei Pg=1-Pv

Für n = 3, b = 10, p = 3 ergibt sich:
Code:
m = 120
u(m,n) = 120*119*118 = 1685040
Pv = 1685040 / 1728000 ~ 97,5 %
Pg = 1 - Pv = 2,5 %
 
X

Xyz1

Gast
@Der Wissende Wenn man keine Antwort hat, muss man nicht antworten. Auch nicht mit BS oder Flamewars...

Das ist Kindergartengealbere und an der Aufgabe vorbei...

@ all Falls ihr wisst, was an der Formel falsch ist, bitte schreiben.
 
X

Xyz1

Gast
Stimmt leider nicht.
Java:
for (int j = 1; j < 5; j++) {
	for (int i = j; i < 10; i++) {
		int n1 = i;
		int n2 = 1;
		int n3 = j;
		System.out.println("Es gibt " + n3 + " Personen.");
		long n4 = fac(n1) / (fac(n1 - n2) * fac(n2));
		System.out.println("Es gibt " + n4 + " mögliche Pizzen.");
		double n5 = (double) fac((int) n4) / fac((int) n4 - n3);
		System.out.println("Mit einer Wahrscheinlichkeit von " + (float) n5 + " mögen zwei Personen die gleiche Pizza.");

		int x = 0;
		for (int l = 0; l < 1000; l++) {
			boolean b = false;
			int[] ii = new int[(int) n4];
			for (int k = 0; k < n3; k++) {
				ii[new Random().nextInt(ii.length)]++;
			}
			for (int k = 0; k < ii.length; k++) {
				if (ii[k] >= 2) {
					b = true;
				}
			}
			if (b) {
				x++;
			}
		}
		System.out.println(x / 1000.0);
	}
}
 
X

Xyz1

Gast
@Der Wissende Es liegt durchaus "in der Natur der Pizzerien", dass bei mehreren Personen, einzelne eine Pizza bekommen, die sie gar nicht bestellt haben. Diese Wahrscheinlichkeit steigt mit der Anzahl der Personen.

Es ist also kein realitätsferner Quatsch und indirekt hatte der TE auch danach gefragt.

Deswegen verstehe ich nicht, warum Du jetzt so einen Dackel davon machst...
 

mihe7

Top Contributor
Java:
double n6 = 1.0 - n5 / Math.pow(n4, n3);
dürfte dann die Wahrscheinlichkeit sein...
 
X

Xyz1

Gast
@mihe7 Du Verrückte/r... Das funktioniert, solange es nicht mehr Personen als Pizzen gibt:
Java:
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("Wie viele Beläge gibt es?");
		int n1 = sc.nextInt();
		System.out.println("Wie viele Beläge gibt es pro Pizza?");
		int n2 = sc.nextInt();
		System.out.println("Wie viele Personen gibt es?");
		int n3 = sc.nextInt();
		long n4 = fac(n1) / (fac(n1 - n2) * fac(n2));
		System.out.println("Es gibt " + n4 + " mögliche Pizzen.");
		double n5 = (double) fac((int) n4) / (double) fac((int) n4 - n3);
		double n6 = 1.0 - n5 / Math.pow(n4, n3);
		System.out.println("Mit einer Wahrscheinlichkeit von " + (float) n6 + " bekommen zwei Personen die gleiche Pizza.");
	}

	public static long fac(int i) {
		long l = 1;
		while (i > 0) {
			l *= i--;
		}
		return l;
	}


Code:
Wie viele Beläge gibt es?
5
Wie viele Beläge gibt es pro Pizza?
3
Wie viele Personen gibt es?
6
Es gibt 10 mögliche Pizzen.
Mit einer Wahrscheinlichkeit von 0.8488 bekommen zwei Personen die gleiche Pizza.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
W junit.Test not accessible? Java Basics - Anfänger-Themen 4
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
D Hilfe bei Calculator Test Java Basics - Anfänger-Themen 15
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
M Test auf Exceptions schreiben Java Basics - Anfänger-Themen 11
P Eclipse Karate Framework API Test . Unexpected Error: the trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 1
I Variable innerhalb Methode: Local variable test defined in an enclosing scope must be final or effectively final Java Basics - Anfänger-Themen 3
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
A Test Junit Java Basics - Anfänger-Themen 1
H Junit test Java Basics - Anfänger-Themen 12
P JUnitTest Best Practise (Ein Assert pro Test?) Java Basics - Anfänger-Themen 10
P Methoden JUnit 4 - Test Java Basics - Anfänger-Themen 6
Mr_Kleeblatt Operatoren if (arri[i] != "test.java"&& arri[i] != "test.class") Java Basics - Anfänger-Themen 3
N Fehler bei JUnit Test Java Basics - Anfänger-Themen 5
L Test-Methoden schreiben Java Basics - Anfänger-Themen 13
neerual Klassen Wie rufe ich Klassen, die andere Klassen extenden in einer Test Unit auf? Java Basics - Anfänger-Themen 10
B JUnit Test erstellen Java Basics - Anfänger-Themen 6
B zzz.test Java Basics - Anfänger-Themen 13
W Problem bei JUnit Test Aufgabe Java Basics - Anfänger-Themen 15
W JUnit Test und HashCode Java Basics - Anfänger-Themen 14
C Erste Schritte Hexidezimal-Test Java Basics - Anfänger-Themen 2
A Kfz - Händler Klasse. JUnit-Test gibt noch Fehler an, aber finde Ursache nicht Java Basics - Anfänger-Themen 7
B Palindrom Test mit Junit Java Basics - Anfänger-Themen 23
T Minesweeper Test Java Basics - Anfänger-Themen 2
S Junit Test Java Basics - Anfänger-Themen 2
F Test Java Basics - Anfänger-Themen 12
W Ist das ein legitimer Test? Java Basics - Anfänger-Themen 5
shiroX Methoden JUnit-Test einer void-Methode Java Basics - Anfänger-Themen 4
U Best Practice Datenbereitstellung Unit Test Java Basics - Anfänger-Themen 6
B Binäre Suche - Junit Test Java Basics - Anfänger-Themen 6
B Datentypen Test float und double speichern Zahlen nur ungefähr Java Basics - Anfänger-Themen 4
Z Vererbung Test auf Normalverteilung, Wilcoxon Java Basics - Anfänger-Themen 3
M Assertion NotNull Test Java Basics - Anfänger-Themen 3
S Separate Funktion für JUnit-Test Java Basics - Anfänger-Themen 3
W Test, ob Datei existiert, schlägt fehl Java Basics - Anfänger-Themen 4
T JUnit test failed Java Basics - Anfänger-Themen 3
H Array Test Methode schreiben Java Basics - Anfänger-Themen 3
R JUnit Test mit einer Dateistruktur als Testparameter Java Basics - Anfänger-Themen 3
V Bruchrechner Test Java Basics - Anfänger-Themen 7
T Test läuft schief Java Basics - Anfänger-Themen 3
shiroX OOP Array kleinste Zahl mit jUnit test Java Basics - Anfänger-Themen 3
G mache aus Test nach sortieren estt oder java aajv Java Basics - Anfänger-Themen 5
S Code stimmt nicht für vorgegebenen JUnit-Test Java Basics - Anfänger-Themen 2
x22 Java Multiple Choice Test Java Basics - Anfänger-Themen 8
R JUnit Test mit mehrfach ausgeführt Java Basics - Anfänger-Themen 6
B JUnit - Mini-Test Java Basics - Anfänger-Themen 9
T Unterschied zwischen Integrationstest und JUnit test? Java Basics - Anfänger-Themen 12
N Test mit assert Java Basics - Anfänger-Themen 9
Y Junit Test - Testwert ändert sich Java Basics - Anfänger-Themen 12
K Palindrom Test Java Basics - Anfänger-Themen 9
S Performance-/Stress Test für Webanwendung Java Basics - Anfänger-Themen 2
V Mediaplayer - NullPointerException bei Unit-Test Java Basics - Anfänger-Themen 4
H Ich kann mein Java Programm Test.class nicht ausführen Java Basics - Anfänger-Themen 6
H Javabefehl Test Java Basics - Anfänger-Themen 3
S Hilfe zu Java-Programm und JUnit Test!! Java Basics - Anfänger-Themen 5
T JUNit Test IOException Java Basics - Anfänger-Themen 5
H lucas-test Java Basics - Anfänger-Themen 14
P White-Box-Test Verständnisproblem Java Basics - Anfänger-Themen 11
N Methoden Test ob Server vorhanden ist Java Basics - Anfänger-Themen 4
N Test Datei = Bild Java Basics - Anfänger-Themen 5
S Erste Schritte 1. Test Programm Java Basics - Anfänger-Themen 21
Spin JUNIT Test Case - Problem bei testen Java Basics - Anfänger-Themen 2
T brauche HILFE beim Junit test:eek: Java Basics - Anfänger-Themen 11
timbeau JUnit Test Dauer speichern/loggen Java Basics - Anfänger-Themen 16
E Am Mittwoch Test und ich checks überhaupt nich Java Basics - Anfänger-Themen 27
A junit test wann verwendet man "was"? Java Basics - Anfänger-Themen 4
J JUnit Test Java Basics - Anfänger-Themen 2
D Test einer Chipkarte Java Basics - Anfänger-Themen 2
J Problem mit Test-Klasse Java Basics - Anfänger-Themen 4
E Test, ob String in Double umwandelbar ist Java Basics - Anfänger-Themen 3
J Test steht vor der Tür !! Java Basics - Anfänger-Themen 2
X Array nur mit Zahlen (test) Java Basics - Anfänger-Themen 11
Houly JUnit Test Suite anlegen Java Basics - Anfänger-Themen 6
F Primitiver Lucas-Lehmer-Test hängt sich auf Java Basics - Anfänger-Themen 7
M Erster HashMap-test Java Basics - Anfänger-Themen 5
O Test auf JComponent Java Basics - Anfänger-Themen 7
pun Junit Test erkennt Exception nicht.. Java Basics - Anfänger-Themen 14
D C0 und C1 Test nochmal Java Basics - Anfänger-Themen 9
D C0 und C1 Test Java Basics - Anfänger-Themen 3
G BlueJ jUnit Test Java Basics - Anfänger-Themen 6
J Test auf UTF-8 Java Basics - Anfänger-Themen 2
M Wo und wie speich. ich .java und wo den zugehörigen test? Java Basics - Anfänger-Themen 2
Shalimar Test, ob mehr pos. oder neg. Zahlen Java Basics - Anfänger-Themen 3
M test Java Basics - Anfänger-Themen 5
M test Java Basics - Anfänger-Themen 2
M test Java Basics - Anfänger-Themen 10
V Test mit JUnit verbinden Java Basics - Anfänger-Themen 3
M test Java Basics - Anfänger-Themen 4
H Miller Rabin Test Primzahlen werden teilweise nicht gefunden Java Basics - Anfänger-Themen 5
C Multiple Choice Test Java Java Basics - Anfänger-Themen 5
G Grundfläche färben, ein Bild (NORTH) ind Test darunter? Java Basics - Anfänger-Themen 6
M Palindrom Test mit Char-arrays! Java Basics - Anfänger-Themen 3
M Java Test Übungsfragen Hilfe! Java Basics - Anfänger-Themen 5
B JUnit Test Klasse Rational Java Basics - Anfänger-Themen 12
N class Test<E extends MyAbstractClass> => typ von E? Java Basics - Anfänger-Themen 5
G jar cvf test.war -C src/ WEB-INF -C src/ ALLE JSP Wildcard? Java Basics - Anfänger-Themen 2
0 Quadratzahl-Test Java Basics - Anfänger-Themen 4
C Unsupported major.minor bei jUnit Test Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben