Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Java EditorZahlen im Array suchen und Index angeben
Hallöchen,
mein Infolehrer hat sich bei dem praktischen Teil für eine Klausur kurzfristig umentschieden, aber ich weiß leider nicht so recht, wie ich die Aufgabe machen soll.
Und zwar sollen wir aus einem sortierten Array eine bestimmte Zahl suchen lassen, sagen ob sie existiert und, falls sie existiert, uns ausgeben lassen an welcher Stelle diese Zahl ist.
Mein Problem hierbei ist, dass ich zwar herausgefunden habe, wie ich die Zahl theoretisch finden kann, indem ich diesen Code verwende:
jNsuche.getText();
for (i=0;i<10;i++) {
if(contains(zzz,suche)){
jTZahlda.setText("Zahl existiert in der Liste");
}
else {
jTZahlda.setText("Zahl existiert nicht in der Liste");
} // end of if-else
} // end of for
Das Problem hierbei ist jedoch, dass, egal ob die Zahl im Array existiert oder nicht, es immer den ersten Fall, also "Die Zahl existiert in der Liste" anzeigt, was aber Augenscheinlich falsch ist.
Könnt ihr mir bei der Behebung dieses Fehlers irgendwie behilflich sein?
Mein zweites Problem wäre die Frage, wie ich den Index dieser Zahl dann ausgeben kann.
Bei diesem Punkt habe ich noch keine greifbare Idee und ich hoffe sehr, das ihr auch bei dieser Frage weiterhelfen könnt.
Code bitte immer in Code-Tags angeben (Über dem Eingabefenster den Knopf </> drücken!)
Und dann bitte immer den ganzen Code posten, der benötigt wird zum Nachvollziehen. Die Methode contains wird benutzt, aber keine Ahnung, was Du da machst. Ebenso sind die Parameter zzz und suche uns unbekannt.
Ohne ausreichende Informationen werden wir dir nicht wirklich helfen können. Generell sieht es aber etwas dubios aus - Wieso eine Schleife bis 10?
Ist es auf genau 10 Elemente festgelegt? Und wenn Du ein Array mit sortierten Elementen hast: Da muss man nicht wirklich durch das Array durchlaufen sondern kann sozusagen immer in der Mitte das Element prüfen und dann ist das gesuchte Element entweder gefunden oder eben recht bzw. links im Teil zu suchen. Und sobald die Grenzen gleich sind ist das Element entweder gefunden oder es kommt nicht vor.
In diesem Fall ist zzz[] die Zufallsliste (sprich der Array), welcher hier auf insgesamt 10 Zahlen beschränkt ist. int suche beschreibt in diesen Fall die gesuchte Zahl, welche zuvor in einem jNumberField eingelesen wird.
[CODE lang="java" highlight="44-52"]zzz= new int [10]; //Zufallszahlen kommen in diesem Fall von zwei weiteren, zu einer zusammengefügten Liste
zzz[0]=zz1[0]; // diese Listen gehen jeweils von 0 bis 50
zzz[1]=zz1[1];
zzz[2]=zz1[2];
zzz[3]=zz1[3];
zzz[4]=zz1[4];
zzz[5]=zz2[0];
zzz[6]=zz2[1];
zzz[7]=zz2[2];
zzz[8]=zz2[3];
zzz[9]=zz2[4];
bubblez=new int [10]; //Die komplette Liste ist mit BubbleSort sortiert
bubblez=zzz;
for (i=0;i<10;i++) //äußere Schleife -> sooft bis kein Tausch mehr erfolgen kann
{
for (j=0;j<10-1;j++) //innere Schleife vergleicht und tauscht benachbarte Elemente
{
if (bubblez[j]>bubblez[j+1])
{
hilfz=bubblez[j];
bubblez[j]=bubblez[j+1]; //Tauschvorgang
bubblez[j+1]=hilfz;
} // end of if
} // end of for
} // end of for
for (int i = 0; i < 10; i++) //Ausgabe der Liste
{
inhaltz=jTListe3.getText();
inhaltz=inhaltz+zzz+"; ";
jTListe3.setText(inhaltz);
}
} // end of bZusammen_ActionPerformed
public void bStelleausgeben_ActionPerformed(ActionEvent evt) {
// TODO hier Quelltext einfügen
jNStelle3.setInt(zzz[2]); //Suche nach der Zahl eines bestimmten Index
jNStelle7.setInt(zzz[6]); //(ein weiterer Teil der Aufgabe)
jNsuche.getText(); //Festlegung der gesuchten Zahl
for (i=0;i<10;i++) {
if(contains(zzz,suche)){ //Suche ob Zahl vorhanden ist
jTZahlda.setText("Zahl existiert in der Liste");
}
else {
jTZahlda.setText("Zahl existiert nicht in der Liste");
} // end of if-else
} // end of for
} // end of bStelleausgeben_ActionPerformed[/CODE]
Ich hoffe es wird jetzt etwas klarer.
Hier ist nochmal der komplette Frame, jedoch beinhaltet der hier dargestellte Code die zwei oberen Listen nicht, da diese zu einer komplett anderen Aufgabe gehörten und hoffentlich für das Verständnis des Codes nicht weiter wichtig sind.
bubblez=new int [10]; //Die komplette Liste ist mit BubbleSort sortiert
bubblez=zzz;
Das macht relativ wenig Sinn, da Arrays als Referenz gespeichert werden. Die Zweite Zeile kopiert also keine Inhalte des Arrays sondern weist einfach nur die Referenz vom Array zzz dem Array bubblez zu. Das neue Array das eine Zeile drüber erstellt wurde, ist damit dann "weg", da Du keine Referenz mehr darauf hast.
Dann hast Du da jNsuche.getText(); - Der Aufruf gibt Dir den Text aus dem Control jNsuche zurück. Da Du mit der Rückgabe nichts machst, ist das Ergebnis von dem Code = null. Die Rückgabe musst Du natürlich in eine Variable speichern. Und das es ein String ist, musst Du die Zahl davon bekommen, z.B. durch Integer.parseInt.
Deine contains Methode sehen wir immer noch nicht... Aber suche wurde ja auch nicht gesetzt, daher kann da wohl auch nicht wirklich was brauchbares bei raus kommen denke ich mal....
Das macht relativ wenig Sinn, da Arrays als Referenz gespeichert werden. Die Zweite Zeile kopiert also keine Inhalte des Arrays sondern weist einfach nur die Referenz vom Array zzz dem Array bubblez zu. Das neue Array das eine Zeile drüber erstellt wurde, ist damit dann "weg", da Du keine Referenz mehr darauf hast.
Danke für diesen Hinweis. Wir haben das in der Schule leider nicht anders gesagt bekommen, bzw. wir wurden nicht verbessert, was diesen Teil des Codes anging...
Dann hast Du da jNsuche.getText(); - Der Aufruf gibt Dir den Text aus dem Control jNsuche zurück. Da Du mit der Rückgabe nichts machst, ist das Ergebnis von dem Code = null. Die Rückgabe musst Du natürlich in eine Variable speichern. Und das es ein String ist, musst Du die Zahl davon bekommen, z.B. durch Integer.parseInt.
Das versteh ich leider nicht so ganz... Wir haben es bei uns so gelernt, dass wir mit diesem Ausdruck in dem jeweiligen NumberField die gewünschte Zahl eingeben, welche dann, soweit ich weiß, weiterverwendet wird. Aber ich bin jetzt auch nicht so tief in der Thematik drin🤔
Möglicherweise hat sich euer Informatiklehrer ein raffiniertes System ausgedacht, um es euch "so einfach wie möglich zu machen".
Es ist durchaus denkbar, dass der Aufruf von jNsuche.getText() den Inhalt eines Eingabefeldes (als Zahl) in eine Variable suche schreibt.
Da wir dieses System aber nicht kennen, ist es schwer, den Code zu verstehen.
Möglicherweise hat sich euer Informatiklehrer ein raffiniertes System ausgedacht, um es euch "so einfach wie möglich zu machen".
Es ist durchaus denkbar, dass der Aufruf von jNsuche.getText() den Inhalt eines Eingabefeldes (als Zahl) in eine Variable suche schreibt.
Da wir dieses System aber nicht kennen, ist es schwer, den Code zu verstehen.
Ja, man könnte Dir helfen, so Du uns den entscheidenden Code zeigst. Die Prüfung findet bei Dir in einer Methode contains statt und diese hast Du uns noch nicht gezeigt. Oder habe ich da etwas übersehen? Also bitte: Bring den ganzen Code. Zumindest diese eine Klasse könntest Du komplett zeigen statt nur so Ausschnitten bei dem dann entscheidendes fehlt!
Möglicherweise hat sich euer Informatiklehrer ein raffiniertes System ausgedacht, um es euch "so einfach wie möglich zu machen".
Es ist durchaus denkbar, dass der Aufruf von jNsuche.getText() den Inhalt eines Eingabefeldes (als Zahl) in eine Variable suche schreibt.
Da wir dieses System aber nicht kennen, ist es schwer, den Code zu verstehen.
Das halte ich ehrlich gesagt für unwahrscheinlich. suche ist eine lokale oder Instanzvariable. Eine Methode, die auf jNsuche aufgerufen wird, sollte diese so eigentlich nicht verändern. Wobei das eine interessante Idee ist. In .Net gab es viel in Richtung "Eventbasierte Entwicklung" - da würde dann das jNsuche etwas in der aktuellen Instanz triggern ... Aber auch die Namensgebung deutet nicht darauf hin - das wäre dann ja eher etwas, das direkt bei Veränderung getriggert würde (also eine Art "Binding"). Aber doch nicht bei getText. Die Erwartungshaltung bei getText ist, dass einfach nur ein Text zurück gegeben wird... aber vielleicht bekommen wir ja die ganze Klasse und können dann auch sehen, was jNsuche ist und wie das alles initialisiert wurde ...
Die Methode contains habe ich leider bloß durch recherchieren gefunden und weiß deshalb nicht so ganz, wie diese genau funktioniert.
Mir stellt sich grad die Frage, ob man es auch anders programiieren könnte, also zum Beispiel mit dieser Variante:
Java:
suche=12;
jNsuche.setInt(suche);
for (i=0;i<10;i++) {
if(zzz[i]!=suche){
jTZahlda.setText("Zahl existiert nicht in der Liste");
}
else {
jTZahlda.setText("Zahl existiert in der Liste");
} // end of if-else
} // end of for
Ich weiß aber selbst nicht, ob dies so richtig funktioniert...
Mein kompletter Code ist leider durch jFrame etwas unübersichtlich aber ich kann ihn gerne nochmal mit reinstellen...
[CODE lang="java" highlight="33-36,175-341"]import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Zusammen extends JFrame {
// Anfang Attribute
private JLabel lListe1 = new JLabel();
private JLabel lListe2 = new JLabel();
private JLabel lListe3 = new JLabel();
private JButton bBilden = new JButton();
private JButton bZusammen = new JButton();
private JTextArea jTListe1 = new JTextArea("");
private JScrollPane jTListe1ScrollPane = new JScrollPane(jTListe1);
private JTextArea jTListe2 = new JTextArea("");
private JScrollPane jTListe2ScrollPane = new JScrollPane(jTListe2);
private JTextArea jTListe3 = new JTextArea("");
private JScrollPane jTListe3ScrollPane = new JScrollPane(jTListe3);
private JLabel lSucheanStelle3 = new JLabel();
private JLabel lSucheanStelle7 = new JLabel();
private JButton bStelleausgeben = new JButton();
private JNumberField jNStelle3 = new JNumberField();
private JNumberField jNStelle7 = new JNumberField();
private JTextField jTZahlda = new JTextField();
private JLabel lGesuchteZahleingeben = new JLabel();
private JNumberField jNsuche = new JNumberField();
private JButton bClearStelleausgeben = new JButton();
private JNumberField jNIndex = new JNumberField();
private JLabel lDiegesuchteZahlistvorhanden = new JLabel();
private JLabel lIndexderZahl = new JLabel();
private JButton bClearall = new JButton();
//Meine eigenen Attribute
private int zz1[], zz2[], i, j, bubble1[], bubble2[], hilf1, hilf2; //für die ersten beiden Listen
private String inhalt1, inhalt2, inhaltz;
private int zzz[], bubblez[], hilfz, suche, d; //Für Liste 3 + Stelle ausgeben
// Ende Attribute
public Zusammen() {
// Frame-Initialisierung
super();
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 284;
int frameHeight = 782;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setTitle("Zusammen");
setResizable(false);
Container cp = getContentPane();
cp.setLayout(null);
// Anfang Komponenten
public static void main(String[] args) {
new Zusammen();
} // end of main
public void bBilden_ActionPerformed(ActionEvent evt) {
// Liste 1 + 2 bilden
zz1 = new int [5]; //Liste 1
for (i=0;i< 5; i++)
{
zz1=(int)(Math.random()*50); //generieren der Zufallszahlen
if (i>0)
{
for (j=0;j<i;j++)
{
if (zz1==zz1[j]) //doppelte ZZ ausschließen
{
i=i-1;
} // end of if
} // end of for
} // end of if
} // end of for
bubble1=new int [5];
bubble1=zz1;
for (i=0;i<5;i++) //äußere Schleife -> sooft bis kein Tausch mehr erfolgen kann
{
for (j=0;j<5-1;j++) //innere Schleife vergleicht und tauscht benachbarte Elemente
{
if (bubble1[j]>bubble1[j+1])
{
hilf1=bubble1[j];
bubble1[j]=bubble1[j+1]; //Tauschvorgang
bubble1[j+1]=hilf1;
} // end of if
} // end of for
} // end of for
//Ausgabe sortierte Zufallszahlen Liste 1
for (int i = 0; i < 5; i++)
{
inhalt1=jTListe1.getText();
inhalt1=inhalt1+zz1+"; ";
jTListe1.setText(inhalt1);
}
zz2 = new int [5]; //Liste 2
for (i=0;i< 5; i++)
{
zz2=(int)(Math.random()*50); //generieren der Zufallszahlen
if (i>0)
{
for (j=0;j<i;j++)
{
if (zz2==zz2[j]) //doppelte ZZ ausschließen
{
i=i-1;
} // end of if
} // end of for
} // end of if
} // end of for
bubble2=new int [5];
bubble2=zz2;
for (i=0;i<5;i++) //äußere Schleife -> sooft bis kein Tausch mehr erfolgen kann
{
for (j=0;j<5-1;j++) //innere Schleife vergleicht und tauscht benachbarte Elemente
{
if (bubble2[j]>bubble2[j+1])
{
hilf2=bubble2[j];
bubble2[j]=bubble2[j+1]; //Tauschvorgang
bubble2[j+1]=hilf2;
} // end of if
} // end of for
} // end of for
//Ausgabe sortierte Zufallszahlen Liste 2
for (int i = 0; i < 5; i++)
{
inhalt2=jTListe2.getText();
inhalt2=inhalt2 + zz2 +"; ";
jTListe2.setText(inhalt2);
}
} // end of bBilden_ActionPerformed
public void bZusammen_ActionPerformed(ActionEvent evt) {
// Liste 3 bilden
zzz= new int [10];
zzz[0]=zz1[0];
zzz[1]=zz1[1];
zzz[2]=zz1[2];
zzz[3]=zz1[3];
zzz[4]=zz1[4];
zzz[5]=zz2[0];
zzz[6]=zz2[1];
zzz[7]=zz2[2];
zzz[8]=zz2[3];
zzz[9]=zz2[4];
bubblez=new int [10];
bubblez=zzz;
for (i=0;i<10;i++) //äußere Schleife -> sooft bis kein Tausch mehr erfolgen kann
{
for (j=0;j<10-1;j++) //innere Schleife vergleicht und tauscht benachbarte Elemente
{
if (bubblez[j]>bubblez[j+1])
{
hilfz=bubblez[j];
bubblez[j]=bubblez[j+1]; //Tauschvorgang
bubblez[j+1]=hilfz;
} // end of if
} // end of for
} // end of for
for (int i = 0; i < 10; i++)
{
inhaltz=jTListe3.getText();
inhaltz=inhaltz+zzz+"; ";
jTListe3.setText(inhaltz);
}
} // end of bZusammen_ActionPerformed
public void bStelleausgeben_ActionPerformed(ActionEvent evt) {
// Bestimmte Stelle ausgeben + Suche ob Zahl vorhanden ist
jNStelle3.setInt(zzz[2]);
jNStelle7.setInt(zzz[6]);
suche=12;
jNsuche.setInt(suche);
for (i=0;i<10;i++) {
if(zzz!=suche){
jTZahlda.setText("Zahl existiert nicht in der Liste");
}
else {
jTZahlda.setText("Zahl existiert in der Liste");
} // end of if-else
} // end of for
jNIndex.setInt(d);
} // end of bStelleausgeben_ActionPerformed
public void bClearStelleausgeben_ActionPerformed(ActionEvent evt) {
// Clear Stelle ausgeben
jNStelle3.clear();
jNStelle7.clear();
jNsuche.clear();
jTZahlda.setText(" ");
jNIndex.clear();
} // end of bClearStelleausgeben_ActionPerformed
public void bClearall_ActionPerformed(ActionEvent evt) {
// Clear alles
jTListe1.setText(" ");
jTListe2.setText(" ");
jTListe3.setText(" ");
jNStelle3.clear();
jNStelle7.clear();
jNsuche.clear();
jTZahlda.setText(" ");
jNIndex.clear();
} // end of bClearall_ActionPerformed
// Ende Methoden
} // end of class Zusammen
[/CODE]
Markiert sind in diesem Fall alle Sachen, welche ich selbst in das Programm eingefügt habe.
Ich habe hier zudem das oben schon verwendete benutzt, bin aber im Programm noch zu keiner entgültigen Lösung gekommen.
Nein. Überleg mal, was passiert, wenn die Schleife läuft. Sagen wir mal, das gesuchte Element befindet sich an erster Stelle (i==0). Dann wird in der ersten Iteration "Zahl existiert in Liste" gesetzt. In der zweiten Iteration stimmt das Element an Position i nicht mehr mit dem gesuchten Element überein und es wird "Zahl existiert nicht in der Liste" ausgegeben. Klar, oder?
Dann wird in der ersten Iteration "Zahl existiert in Liste" gesetzt. In der zweiten Iteration stimmt das Element an Position i nicht mehr mit dem gesuchten Element überein und es wird "Zahl existiert nicht in der Liste" ausgegeben. Klar, oder?
Ok. Könnte man das irgendwie mit break oder so so programmieren, dass das funktionieren würde oder müsste ich das komplett anders machen?
Ich glaube, so funktioniert es...
[CODE lang="java" highlight="9"]suche=12;
jNsuche.setInt(suche);
for (i=0;i<10;i++) {
if(zzz!=suche){
jTZahlda.setText("Zahl existiert nicht in der Liste");
}
else {
jTZahlda.setText("Zahl existiert in der Liste");
break;
} // end of if-else
} // end of for[/CODE]