Und-Abfrage mit mehreren Ungleich-Operatoren

Sim00

Mitglied
Hallo zusammen!
Das Codebeispiel unten ist einer von mehreren gleich aufgebauten Blöcken in einer längeren Methode, von der ansonsten auch alles funktioniert wie es soll, nur eben diese Blöcke nicht. Die Variable min ist 0 und max ist 25. Was ich erreichen möchte, ist, dass erst eine Zufallszahl b zwischen 0 und 25 (einschließlich) erzeugt wird, und zwar so oft, bis sie einer der darunter aufgeführten Zahlen entspricht, was ich probiert habe mit den Ungleich Operatoren zu lösen.
Kann mir jemand sagen wo das Problem liegt, und/oder wie man das eventuell eleganter lösen könnte?
Vielen Dank im Voraus 🙂

Java:
else if(array1[i-1]=="C"){

int b = (int)(Math.random()*(max-min+1)+min);

                        while(b!=0 & b!=4 & b!=7 & b!=8 & b!=10 & b!=11 & b!=13 & b!=14 & b!=17 & b!=19& b!=20& b!=24){

                            b = (int)(Math.random()*(max-min+1)+min);

                        }

                        String a = Umwandeln.ZuBuchstabe(b);       

                        array1 = a;

}
 
Die Abfrage & ist Bitweise was du brauchst wäre in dem Kontext && und && würde nur bedingt Sinn machen, da Variable b nicht gleich 0 und gleich 4 und gleich 7 usw. sein kann. Was du brauchst wäre ein oder ||
 
Die Abfrage & ist Bitweise was du brauchst wäre in dem Kontext && und && würde nur bedingt Sinn machen, da Variable b nicht gleich 0 und gleich 4 und gleich 7 usw. sein kann. Was du brauchst wäre ein oder ||
Wie LimDul sagt, || funktioniert nicht.
Ein Oder wäre an der Stelle Unfug und immer true. Das oder müsste dann auf == gehen.
Du hast da ein bitweises und drin - das logische und ist "&&"
Hätte ich vielleicht dazu sagen sollen, ich hatte zuerst denn &&-Operator drin, der hat allerdings auch nicht funktioniert.
 
Definiere "funktioniert nicht". Sprich - was ist exakt ist passiert und kam raus.

Funktioniert nicht ist so hilfreich wie wie bei der Werkstatt anzurufen "Mein Auto tuts nicht, was kann ich tun" 🙂
 
Die Abfrage & ist Bitweise was du brauchst wäre in dem Kontext && und && würde nur bedingt Sinn machen, da Variable b nicht gleich 0 und gleich 4 und gleich 7 usw. sein kann. Was du brauchst wäre ein oder ||
Also der Hinweis mit dem && für den logischen Ausdruck ist richtig. Aber es funktioniert prinzipiell auch mit dem binären &.
Und die Und Verknüpfung ist auch ok.

Daher wäre die Frage, was Deiner Meinung nach nicht funktioniert?

Java:
public class Test {
    public static void main(String[] args) {
        int b;
        do {
            b =(int)(Math.random()*10);
            System.out.println(b);
        } while (b!=1 & b!=2 & b!=3);
        System.out.println("Ergebnis: " + b);
    }
}

Also hier ist einfach nur die Frage, was Deiner Meinung nach nicht funktioniert.

Er läuft so lange durch, bis er 1, 2 oder 3 hat und gibt dies dann als Ergebnis:

Java:
java helloworld\Test.java
5
6
0
3
Ergebnis: 3
 
Ach ja - bezüglich & | und ^ mit boolean Ausdrücken: JLS 15.22.2 - da wird das Verhalten definiert und damit ist das natürlich eine gültige Schreibweise.
 
Warum fällt mir das auch immer jetzt erst ein, wenn etwas fertig geschrieben ist: Die Frage ist doch, was der Unterschied zwischen & und && ist.
Man nehme nur die folgenden zwei Ausdrücke:
Java:
f(x) & g(y)
f(x) && g(y)
Der erste Ausdruck wird immer f(x) und g(x) ausführen.
Der Zweite Ausdruck ist abhängig von der Evaluierung:
Wenn f(x) schon false ist, dann steht das Ergebnis des Ausdrucks (false) schon fest und er muss g(y) nicht mehr ausführen.

Daher gibt es auch nur && und || und kein ^^ (xor). Denn ein conditional xor macht keinen Sinn. Egal was der erste Ausdruck ist: der zweite Ausdruck wird das Endergebnis beeinflussen.
 
Also der Hinweis mit dem && für den logischen Ausdruck ist richtig. Aber es funktioniert prinzipiell auch mit dem binären &.
Und die Und Verknüpfung ist auch ok.

Daher wäre die Frage, was Deiner Meinung nach nicht funktioniert?

Java:
public class Test {
    public static void main(String[] args) {
        int b;
        do {
            b =(int)(Math.random()*10);
            System.out.println(b);
        } while (b!=1 & b!=2 & b!=3);
        System.out.println("Ergebnis: " + b);
    }
}

Also hier ist einfach nur die Frage, was Deiner Meinung nach nicht funktioniert.

Er läuft so lange durch, bis er 1, 2 oder 3 hat und gibt dies dann als Ergebnis:

Java:
java helloworld\Test.java
5
6
0
3
Ergebnis: 3
Bei mir gibt er "null" zurück, dann liegt das Problem scheinbar woanders?
 
Bei mir gibt er "null" zurück, dann liegt das Problem scheinbar woanders?
Wo gibt es null zurück. Ich sehe in dem Code-Abschnitt kein return Befehl.
Aber Du kannst ja einfach Ausgaben einbauen.
Gib das b aus, ehe Du Umwandeln.ZuBuchstabe(b); aufrufst. Gib das Ergebnis aus, das da zurück kommt.

Aber b ist ein int. Ein int kann nie null sein.
 
Da das Problem sich wohl im Aufbau der restlichen Methode verbirgt, hier einmal die vollständige Methode. Der else if Block kommt danach noch für alle anderen Buchstaben nur mit anderen Bedingungen, die hab ich jetzt der Übersichtlichkeit halber mal ausgelassen. Aktuell ist die Ausgabe (beispielhaft):
Namegenerator.main({ });
Enullnullnullnull
Fnullnullnullnull
Onullnullnullnull
Unullnullnullnull
Knullnullnullnull
Anullnullnullnull
Znullnullnullnull
Unullnullnullnull
Wnullnullnullnull
Cnullnullnullnull

Java:
 public static void main( String args[] )   
    { 
        for(int k = 0; k < 10; k++) {   
            int min =0;
            int max=25;

            StringBuilder line1 = new StringBuilder();     
            int j = 5;                                     
            String [] array1 = new String[j];             

            for(int i = 0; i < array1.length; i++) {

                if(i==0){
                    int b = (int)(Math.random()*(max-min+1)+min);
                    String a = Umwandeln.ZuBuchstabe(b);         
                    array1[i] = a;
                }

                else if{
                    if(array1[i-1]=="A"){
                        int b = (int)(Math.random()*(max-min+1)+min);
                        while(b!=1 & b!=2 & b!=3 & b!=5 & b!=6 & b!=7 & b!=9 & b!=11 & b!=12 & b!=13& b!=14& b!=15 & b!=16 & b!=17 & b!=18 & b!=19 & b!=21 & b!=22 & b!=23 & b!=24 & b!=25 )
                        {
                            b = (int)(Math.random()*(max-min+1)+min);
                        }
                        String a = Umwandeln.ZuBuchstabe(b);         
                        array1[i] = a;
                    }
                    
            for(int i = 0; i < array1.length; i++) {     
                line1.append(array1[i]);                   
            }

            System.out.println(line1);
        }
    }
 
Also das ist nicht dein Code, der irgend eine Ausgabe bringt, denn der Code ist so nicht übersetzbar.
Java:
else if{
Das dürfte sich nicht übersetzen lassen, denn da ist dann das if ohne Bedingung.

Des Weiteren scheint es so, dass Du die for Schleife, in der Du die array Element anfügst an line1 innerhalb der anderen Schleife ist. Ebenso die Ausgabe.

Dann scheint es so, dass Du nur etwas füllst, wenn der erste Buchstabe ein A ist. Ist dies nicht der Fall, dann machst Du nichts. Damit ist in dem Array einfach nur ein erster Buchstabe und sonst nur null Werte (in einem String array sind nach der Erstellung nur null Werte. Somit scheint es, dass Du das array1 bis auf das erste Feld nicht füllst. Dadurch kommt es bei dem append dann zu "null" Werten, die angehängt werden.
 
Also das ist nicht dein Code, der irgend eine Ausgabe bringt, denn der Code ist so nicht übersetzbar.
Java:
else if{
Das dürfte sich nicht übersetzen lassen, denn da ist dann das if ohne Bedingung.

Des Weiteren scheint es so, dass Du die for Schleife, in der Du die array Element anfügst an line1 innerhalb der anderen Schleife ist. Ebenso die Ausgabe.

Dann scheint es so, dass Du nur etwas füllst, wenn der erste Buchstabe ein A ist. Ist dies nicht der Fall, dann machst Du nichts. Damit ist in dem Array einfach nur ein erster Buchstabe und sonst nur null Werte (in einem String array sind nach der Erstellung nur null Werte. Somit scheint es, dass Du das array1 bis auf das erste Feld nicht füllst. Dadurch kommt es bei dem append dann zu "null" Werten, die angehängt werden.
Was ist wenn ich statt "else if" nur "else" nehme? Bzw. was kann ich machen damit der Array vollständig gefüllt wird? Ich verstehe noch nicht so ganz wo da der logische Fehler im Aufbau ist. Das mit der for Schleife die die Arrayelemente an line1 anhängt und dann ausgibt hat seine Richtigkeit und funktioniert auch wie erwartet. Das Problem scheint wirklich-wie du gesagt hast-darin zu liegen, dass nur die erste Stelle vom Array besetzt wird.
 
Vermutlich sollte dies
Java:
                else if{
                    if(array1[i-1]=="A"){

eher sowas sein:
Java:
                else if(array1[i-1]=="A"){

Oder tatsächlich sowas:
Java:
                else {
                    if(array1[i-1]=="A"){
aber das macht nur dann wirklich Sinn, wenn in dem else mehr wie nur dieses if steht. (Aber technisch geht auch ein
Java:
// ....
else {
    if (...) {
        // ...
    }
}
Das sind dann nur eben Clean Code Regeln, weil ein direktes else if () ... besser lesbar sein dürfte.
 
Hab den Fehler gefunden. Statt der Abfrage
Java:
 if(array1[i-1]=="A")
muss man hier die equals-Methode benutzen:
Java:
 if(array1[i-1].equals("A"))
 
Ja, da hatte ich dann nicht mehr so genau geschaut, aber das ist richtig: Strings vergleicht man mit equals und nicht mit ==. Sehr gut!
 

Zurück
Oben