kleine suche

Status
Nicht offen für weitere Antworten.

ska3k

Aktives Mitglied
Hallo,
ich hab hier eine kleine Suche geschrieben, die einfach nur nach char Zeichen in einem Array sucht und die Position sind dann merkt und später ausgibt. Das Problem ist aber jetzt, dass er die wenn ein Zeichen mit der Position 4 oder mehr immer als 0 speichert. Die Positionen 1-3 speichert er problemlos im zweiten Int-Array. Könnt ihr mir vlt sagen wo mein fehler liegt?

Code:
public class suche {

  public static void main(String[] args) {
    char[] zeichen;
    int[] gefunden;
    char whl,ein;
    final byte ZU_ERZEUGENDE_ZAHLEN=20;

    
      zeichen=erzeugen(ZU_ERZEUGENDE_ZAHLEN);
      ein=input();
      gefunden=suche(ein,ZU_ERZEUGENDE_ZAHLEN,zeichen);
      ausgabe(gefunden);

     [...]
  }
    
  
  private static char[] erzeugen(byte zahlen) {
    char[] z;
    int i,n=1;
    
    
    z=new char[zahlen];
    
    do {
      if (n<10) {
        System.out.print("0"+n+" ");
      } else {
        System.out.print(n+" ");
      }

      n++;
    } while (n<=zahlen);
    
    System.out.println();
    
    for (i=0;i<=zahlen-1;i++) {
      z[i]=(char)Tools.zufall(97,122);
      System.out.print(z[i]+"  ");
    }

    return z;
  }
  
  
  private static char input() {
    char zeichen;
    
    
    System.out.println("\n\nNach welchen Zeichen soll gesucht werden?");
    System.out.print("Zeichen: ");
    zeichen=Eingabe.readChar();
    
    return zeichen;
  }
  
  
  private static int[] suche(char suche, byte ZUFALL, char[] zeichen) {
    int[] ein;
    byte i,n=0;
    
    
    for (i=0;i<ZUFALL;i++) {
      if (zeichen[i]==suche) {
        n++;
      }
    }
    ein=new int[n];
    n=0;
    for (i=0;i<=ein.length;i++) {
      if (suche==zeichen[i]) {
        ein[n]=i;
        System.out.println(i+"| ");   //Zum testen
        n++;
      }
    }

    return ein;
  }
  
  
  private static void ausgabe(int[] g) {
    int i;

    i=0;
    System.out.print("\nGefunden auf Position: ");
    do {
      if (g[i]+1<10) {
        System.out.print("0"+(g[i]+1)+" ");
      } else {
        System.out.print(g[i]+1+" ");
      }
      i++;
    } while (i<g.length);
  }
}


Vielen Dank für eure Hilfe, weiß echt nicht wo der Fehler ist.

Mfg ska3k
 
die suche entweder so:

Code:
private static int[] suche(char suche, byte ZUFALL, char[] zeichen) {
		int[] ein;
		byte i, n = 0;

		for (i = 0; i < ZUFALL; i++) {
			if (zeichen[i] == suche) {
				n++;
			}
		}
		ein = new int[n];
		n = 0;
		for (i = 0; i < ein.length; i++) {
			for (int j = 0; j < ZUFALL; j++) {
				if (zeichen[j] == suche) {
					ein[n] = j;
					System.out.println(j + "| ");
					n++;
				}
			}
		}

		return ein;
	}

oder etwas übersichtlicher


Code:
	private static int[] suche(char suche, byte ZUFALL, char[] zeichen) {
		List l = new ArrayList();
		for (int i = 0; i < ZUFALL; i++) {
			if (zeichen[i] == suche) {
				l.add(Integer.valueOf(i));
			}
		}
		int[] erg = new int[l.size()];
		for (int i = 0; i < erg.length; i++) {
			erg[i] = ((Integer)l.get(i)).intValue();
		}

		return erg;
	}

das beste wäre, wenn du ganz mit einer Liste beliebiger Größe statt mit einem Array arbeiten würdest,
in der Ausgabe musst du auf jeden Fall noch abfangen, dass das Array vielleicht leer ist
 
Du hier statt
Code:
for (i = 0; i <= ein.length; i++)
		{
		...
		{

das schreiben
Code:
for (i = 0; i < ZUFALL; i++)
		{
		...
		{



Hab deinen Code aber mal komplett überarbeitet (Groß-/Kleinschreibung angepasst, unnötige Variablen rausgenommen, do-while zu for-Schleifen umgewandelt, und deine bytes durch ints ersetzt.)

Code:
import java.util.Scanner;

public class Suche
{

	public static void main(String[] args)
	{
		int zuErzeugendeZahlen = 20;

		char[] zeichen = erzeugen(zuErzeugendeZahlen);
		char ein = input();
		int[] gefunden = suche(ein, zuErzeugendeZahlen, zeichen);
		ausgabe(gefunden);

		// [...]
	}

	private static char[] erzeugen(int zahlen)
	{
		char[] z = new char[zahlen];

		for (int i = 0; i < zahlen; i++)
		{
			if (i + 1 < 10)
			{
				System.out.print("0" + (i + 1) + " ");
			}
			else
			{
				System.out.print((i + 1) + " ");
			}
		}

		System.out.println();

		for (int i = 0; i < zahlen; i++)
		{
			z[i] = (char) Tools.zufall(97, 122);
			System.out.print(z[i] + "  ");
		}

		return z;
	}

	private static char input()
	{
		System.out.println("\n\nNach welchen Zeichen soll gesucht werden?");
		System.out.print("Zeichen: ");

		char zeichen = Eingabe.readChar();

		return zeichen;
	}

	private static int[] suche(char suche, int zufall, char[] zeichen)
	{
		int n = 0;

		for (int i = 0; i < zufall; i++)
		{
			if (zeichen[i] == suche)
			{
				n++;
			}
		}

		int[] ein = new int[n];
		n = 0;

		for (int i = 0; i < zufall; i++)
		{
			if (suche == zeichen[i])
			{
				ein[n] = i;
				System.out.println(i + "| "); // Zum testen
				n++;
			}
		}

		return ein;
	}

	private static void ausgabe(int[] g)
	{
		System.out.print("\nGefunden auf Position: ");

		for (int i = 0; i < g.length; i++)
		{
			if (g[i] + 1 < 10)
			{
				System.out.print("0" + (g[i] + 1) + " ");
			}
			else
			{
				System.out.print(g[i] + 1 + " ");
			}
		}
	}
}

EDIT: noch nen Fehler ausgebessert
 
@SlaterB
Wenn ich deinen ersten Code einfüge, dann klappt der fast. Wenn z.b. in der letzten Komponete bei dir die gesuchte char ist und noch in irgend einer anderen dann kommt der Fehler ArrayIndexOutOfBoundsException Warum muss der in der for-Scheife dann noch eine for-Schleife durchführen? Könntest du das noch erläutern?
Wenn ich den zweiten bekomm ich auch Errors, aber er Klasse List nicht findet. Muss ich da vorher noch was importieren? Mit einer Arrayliste hab ich aber bis jetzt noch nicht gearbeitet.

Die Abfrage wenn das Array leer ist kommt noch, soweit war ich noch nicht 😉


@Ariol
Wenn ich "for (i = 0; i < zeichen.length; i++)" einfach bekomm ich den typischen Error, das er auf eine Komponente außerhalb des Arrays zugreifen will.

Bei deinem zweiten Code, wo du das Prog überarbeitet hast, für was musst du da die Scanner Klasse importieren? DIe wird doch nirgends gebraucht. Und bei dir in der Zeile 9 soll eine final variable sein, da dass ein fester Wert ist. Deswegen hab ich den den mofier final gegeben.
 
ska3k hat gesagt.:
@Ariol
Wenn ich "for (i = 0; i < zeichen.length; i++)" einfach bekomm ich den typischen Error, das er auf eine Komponente außerhalb des Arrays zugreifen will.

und an welcher Stelle?
ska3k hat gesagt.:
Bei deinem zweiten Code, wo du das Prog überarbeitet hast, für was musst du da die Scanner Klasse importieren? DIe wird doch nirgends gebraucht. Und bei dir in der Zeile 9 soll eine final variable sein, da dass ein fester Wert ist. Deswegen hab ich den den mofier final gegeben.

Scanner ist noch ein Überbleibsel von mir. Ich hab ja keine Klasse Eingabe und musste etwas improvisieren.
Mit dem final hast du natürlich recht, da war ich wohl etwas zu schnell.

Funktioniert mein 2. Code bei dir?
 
Jap, der geht wunderbar. Die Überprüfung ob evtl. das Array leer ist, ist bei dir aber nocvh nicht drin?
 
Ich hab versucht den Quelltext auszuprobieren, hab aber Fehlermeldung bekommen und weiss nicht, wie ich das abarbeiten soll.


Fehlermeldung:

symbol : variable Tools
location: class Suche
z = (char) Tools.zufall(97, 122);
^
Suche.java:38: inconvertible types
found : Tools.zufall
required: char
z = (char) Tools.zufall(97, 122);
 
jap, du hast keine Tools-Klasse.

Versuchs so:

Code:
import java.util.Scanner;

public class Suche
{

	public static void main(String[] args)
	{
		int zuErzeugendeZahlen = 20;

		char[] zeichen = erzeugen(zuErzeugendeZahlen);
		char ein = input();
		int[] gefunden = suche(ein, zuErzeugendeZahlen, zeichen);
		ausgabe(gefunden);

		// [...]
	}

	private static char[] erzeugen(int zahlen)
	{
		char[] z = new char[zahlen];

		for (int i = 0; i < zahlen; i++)
		{
			if (i + 1 < 10)
			{
				System.out.print("0" + (i + 1) + " ");
			}
			else
			{
				System.out.print((i + 1) + " ");
			}
		}

		System.out.println();

		for (int i = 0; i < zahlen; i++)
		{
			z[i] = (char)(Math.random()*26 + 97);//(char) Tools.zufall(97, 122);
			System.out.print(z[i] + "  ");
		}

		return z;
	}

	private static char input()
	{
		System.out.println("\n\nNach welchen Zeichen soll gesucht werden?");
		System.out.print("Zeichen: ");

		char zeichen = new Scanner(System.in).next().charAt(0);//Eingabe.readChar();

		return zeichen;
	}

	private static int[] suche(char suche, int zufall, char[] zeichen)
	{
		int n = 0;

		for (int i = 0; i < zufall; i++)
		{
			if (zeichen[i] == suche)
			{
				n++;
			}
		}

		int[] ein = new int[n];
		n = 0;

		for (int i = 0; i < zeichen.length; i++)
		{
			if (suche == zeichen[i])
			{
				ein[n] = i;
				System.out.println(i + "| "); // Zum testen
				n++;
			}
		}

		return ein;
	}

	private static void ausgabe(int[] g)
	{
		System.out.print("\nGefunden auf Position: ");

		for (int i = 0; i < g.length; i++)
		{
			if (g[i] + 1 < 10)
			{
				System.out.print("0" + (g[i] + 1) + " ");
			}
			else
			{
				System.out.print(g[i] + 1 + " ");
			}
		}
	}
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben