Frage zu String.indexOf(String)

Status
Nicht offen für weitere Antworten.

songbird

Mitglied
Hallo!

Folgendes (vereinfachtes) Beispiel:

Code:
String[][] fruchtsalat = 
fruchtsalat[0][1] = "Apfel, Birne";
fruchtsalat[1][1] = "Apfel, Birne, Zitrone, Erdbeere, Banane";
fruchtsalat[2][1] = "Zitrone, Banane";
String [] auswahl = {"Apfel", "Banane"};

Jetzt soll verglichen werden. Und zwar das String[] mit dem zweidimensionalen Array verglichen wird. Das Ergebnis darf NUR fruchtsalat[1][1] sein...
Geht das irgendwie mit indexOf() ?

Oder könnt Ihr uns einen anderen Tipp geben. Das obige Beispiel ist eben stark vereinfacht aber ich hoffe Ihr könnt trotzdem nachvollziehen was wir wissen wollen.

Gruß Songbird
 
hmm..wenn ich dein Problem richtig verstanden habe, dann willst du ein beliebig grosses Eindimensionales
Array mit einem beliebig grossen 2-Dimensionalen Array vergleichen, welches Strings mit mehren Früchten
enthält. Hier eine Lösung, du kannst auswahl und fruchtsalat beliebig erweitern!

PS: Ist schnell hingeproggt und nicht speed-optimiert, kannst es aber als denkanstoss nutzen.


Guss Finalbrain




Code:
class Java
{
	private static class Index
	{	
		private int indexA;
		private int indexB;

		public Index()
		{
			indexA = -1;
			indexB = -1;
		}
	}
	
	public static void main(String[] argu)
	{
		
		
		String[][] fruchtsalat = new String[3][2];
		
		for (int i=0; i<3;i++)
			fruchtsalat[i] = new String[2];
			
		fruchtsalat[0][1] = "Apfel, Birne";
		fruchtsalat[1][1] = "Apfel, Birne, Zitrone, Erdbeere, Banane"; 
		fruchtsalat[2][1] = "Zitrone, Banane";
		fruchtsalat[0][0] = "Kirsche, Banane";
		fruchtsalat[1][0] = "Kirsche, Birne, Zitrone, Erdbeere, Banane"; 
		fruchtsalat[2][0] = "Kiwi, Banane";
				
		String[] auswahl = new String[2];
		
		auswahl[0] = "Apfel";
		auswahl[1] = "Banane";
		
		Index ergebnis = getErgebnis(fruchtsalat, auswahl);
		
		if (ergebnis.indexA != (-1))
		{
			System.out.println("In Fruchtsalat["+ergebnis.indexA+"]["+ 
			                                    ergebnis.indexB +"] ist es zu finden!");
		}
		else
		{
			System.out.println("Nix gefunden!!");
		}
		 
	}

	public static Index getErgebnis(String[][] daten, String[] auswahl)
	{
		Index backVal = new Index();
		int isIn      = 0;
			
		for (int a=0; a<daten.length;a++)
		{
			for (int b=0; b<daten[0].length;b++)
			{
				for (int l=0; l< auswahl.length;l++)
					isIn = isIn + isInString(daten[a][b],auswahl[l]);		
			
				if (isIn == auswahl.length)
				{
					backVal.indexA = a;
					backVal.indexB = b;
					return backVal;
				}
				
				isIn = 0;
			}
		}

		return backVal;
	}
	
	public static int isInString(String dest, String str)
	{
		int start = 0;
		int end   = str.length();
		
		if (end == dest.length())
			if (dest.equals(str)) return 1;
			else
				return 0;
		else
			if(end > dest.length()) return 0;
			else
			{
		
				for (start=0; start <= (dest.length() - end); start++)
				{
					String kette = new String();
					
					for (int c=start; c<=(start+str.length()-1);c++)
						kette = kette + dest.charAt(c);
					
					if (kette.equals(str)) return 1;
				}
			}
		
		return 0;
	}

}
 
:shock:

mal eben schnell hingeproggt...
ich steig da ehrlichgesagt nicht so richtig durch, aber du hast es glaub ich auch etwas falsch verstanden, denn die früchte stehen praktisch immer an der [1]... an [0] stehen die fruchtsalat-namen...

aber auf jeden fall vielen dank für deine mühe!
 
Moment..du bist doch gerade Online ....poste mir nochmal ein simpleres Beispiel und etwas ausführlicher..das ding ist schnell gemacht!
 
so ??

Code:
class Java
{
	private static class Index
	{	
		private int indexA;
		private int indexB;

		public Index()
		{
			indexA = -1;
			indexB = -1;
		}
	}
	
	public static void main(String[] argu)
	{
		
		
		String[][] fruchtsalat = new String[3][2];
		
		for (int i=0; i<3;i++)
			fruchtsalat[i] = new String[2];
			
		fruchtsalat[0][1] = "Apfel, Birne";
		fruchtsalat[1][1] = "Apfel, Birne, Zitrone, Erdbeere, Banane"; 
		fruchtsalat[2][1] = "Zitrone, Banane";
		fruchtsalat[0][0] = "Salat1";
		fruchtsalat[1][0] = "Salat2"; 
		fruchtsalat[2][0] = "Salat3";
				
		String[] auswahl = new String[2];
		
		auswahl[0] = "Apfel";
		auswahl[1] = "Banane";
		
		Index ergebnis = getErgebnis(fruchtsalat, auswahl);
		
		if (ergebnis.indexA != (-1))
		{
			System.out.println("In "+fruchtsalat[ergebnis.indexA][0]+ " ist es zu finden!");
		}
		else
		{
			System.out.println("Nix gefunden!!");
		}
		 
	}

	public static Index getErgebnis(String[][] daten, String[] auswahl)
	{
		Index backVal = new Index();
		int isIn      = 0;
			
		for (int a=0; a<daten.length;a++)
		{
			for (int b=1; b<daten[0].length;b++)
			{
				for (int l=0; l< auswahl.length;l++)
					isIn = isIn + isInString(daten[a][b],auswahl[l]);		
			
				if (isIn == auswahl.length)
				{
					backVal.indexA = a;
					backVal.indexB = b;
					return backVal;
				}
				
				isIn = 0;
			}
		}

		return backVal;
	}
	
	public static int isInString(String dest, String str)
	{
		int start = 0;
		int end   = str.length();
		
		if (end == dest.length())
			if (dest.equals(str)) return 1;
			else
				return 0;
		else
			if(end > dest.length()) return 0;
			else
			{
		
				for (start=0; start <= (dest.length() - end); start++)
				{
					String kette = new String();
					
					for (int c=start; c<=(start+str.length()-1);c++)
						kette = kette + dest.charAt(c);
					
					if (kette.equals(str)) return 1;
				}
			}
		
		return 0;
	}

}
 
ich denk mal mit dem originalcode wirst du nicht so recht klarkommen, aber ich kann es ja mal versuchen...
Code:
private String[] stringIngrCopy;  //da sind die zu suchenden zutaten drin
private Vector foundVec = new Vector(); // da sollen die Stellen im menuSearch[][] rein, wenn die Zutaten vorkommen
private Warning wg;
private boolean complFound;

	public void finding()
	{
		int counter = 0; //integer dafür, wieviele Zutaten wirklich im array stehen
		
		for (int i = 0; i < stringIngrCopy.length; i++)
		{
			if(stringIngrCopy[i] == null)
			{
				counter = i;
				i = stringIngrCopy.length;
			} 
		}
				
	    for (int j = 0; j < menuSearch.length; j++)
	    {	
			int v = 0;		
			for (int i = 0; i < counter; i++)
			{
				if (menuSearch[j][1].indexOf(stringIngrCopy[i]) != -1)
				{
					System.out.println("hallo");
					complFound = true;
					v++;
					
				}
				else
				{
					complFound = false;
					i = counter;
				}
				if (v == counter)
				{
					foundVec.addElement(Integer.toString(j));
					
				}
				
			}
		}

		if (foundVec.isEmpty() == true)
		{
			wg = new Warning(this, "Achtung", "Eine Pizza mit der von Ihnen gewählten Zutatenkombination                                    
                        bieten wir leider noch nicht an!", "Okay :-(");
		}
	}
 
probiers mal so...muesste eigentlich funzen

ich glaube du hattest ein Problem mit dem Counter! Ausserdem war die (v == Counter) mit in der inneren
For-Schleife!


Code:
public void finding() 
   { 
      int counter = 0;
      
      for (int i = 0; i < stringIngrCopy.length; i++) 
      	if(stringIngrCopy[i] != null) 
         	counter++; 
             
       for (int j = 0; j < menuSearch.length; j++) 
       {    
         int v = 0;       
         
         for (int i = 0; i < counter; i++) 
         { 
            if (menuSearch[j][1].indexOf(stringIngrCopy[i]) != -1) 
            { 
               System.out.println("Einzelnes Element gefunden!"); 
               v++; 
            } 
         }
         
         if (v == counter) 
         { 
         	foundVec.addElement(Integer.toString(j)); 
            v=0; 
         } 
      } 

      if (foundVec.isEmpty() == true) 
      { 
         wg = new Warning(this, "Achtung", "Eine Pizza mit der von Ihnen gewählten Zutatenkombination bieten wir leider noch nicht an!", "Okay :-("); 
      } 
   }
 
puh, vielen Dank...
Aber es klappt leider immer noch net :?
bekommen immer ne NullPointerException
und zwar in der Zeile:

Code:
...
if (menuSearch[j][1].indexOf(stringIngrCopy[i]) != -1)
...

falls du noch ne idee hättest, wär's klasse 🙂

ich mach aber erstmal schluss für heute... hat jetzt keinen sinn mehr.
 
Hmmm...Wenn du mein Beispiel mit eingebaut hast..dann ist die Zeile ansich in Ordnung!
Es kann nur folgendes sein !

1.) "i" ist ein Index der nicht im eindimensionalen Array exisitert!
2.) "j" ist ein Index der nicht im 2-dimensionalen Array exisitert!

Tippe auf Punkt 2.)

Vielleicht hast du dein, Mehrdimensionales Array "MenuSearch" nicht richtig initialisiert!
(Wegen NullpointerException)


Richtiges Beispiel:

Code:
                                String[][] pizzen = new String[3][2];
		
		// WICHTIG!
                                for (int i=0; i<3;i++)
		    pizzen[i] = new String[2];
			
		pizzen[0][1] = "Käse, Tomate, Salami ";
		pizzen[1][1] = "Käse, Tomate, Thunfisch"; 
		pizzen[2][1] = "Käse, Tomate";
		pizzen[0][0] = "Pizza Salami";
		pizzen[1][0] = "Pizza Thunfisch"; 
		pizzen[2][0] = "Pizza Margaritha";



...sonst kann ich dir morgen so ab 21:00 Uhr helfen :wink:
 
*g* ok!

hast du dann sonst noch ne idee, warum das nicht funzt :-/ ?

Wir haben uns mal an bestimmten Stellen v und j ausgeben lassen. Wenn man jetzt zB Salami sucht, ist j auch richtigerweise erst 1 und dann 7 (weil Salami in den Pizzen menuSearch[1][1] und menuSearch[7][1] vorkommt). Also das Suchen scheint zu funktionieren und das Array scheint auch gefüllt zu sein...
aber das Anhängen an den Vector (foundVec) funzt scheinbar irgendwie nicht. Denn in foundVec müsste ja bei der Suche nach Salami an der Stelle 0 (foundVec.elementAt(0)) eine "1" stehen und an der Stelle 1 (foundVec.elementAt(1)) eine "7". Wenn ich aber System.out.println(foundVec.elementAt(0)) und System.out.println(foundVec.elementAt(1)) aufrufe, bekomme ich nur eine 1 und keine 7...
 
Hier habe eine Lösung für dich..führe das Prog mal aus und studiere es..klappt alles prima :wink:


Code:
import java.util.*;

public class Pizza
{
    private static String[][] menuSearch;
    private static String[]   auswahl;
   
    public static void main(String[] args)
    {
        fillMenue();
   
        auswahl    = new String[10];
        auswahl[0] = "Kaese";
        auswahl[1] = "Tomaten";
        auswahl[2] = "Salami";
   		   		
        Vector ergebnis = finding(auswahl);

        if (ergebnis.isEmpty())
            System.out.println("Keine Pizza mit dieser Komposition gefunden!");
        else
        {
            System.out.println("Die Zutaten gehoeren zu folgenden Pizzen: \n");
						
            for (int i=0; i<ergebnis.size(); i++)
                System.out.println(menuSearch[((Integer)(ergebnis.get(i))).intValue()][0]);
        }
		
        System.out.println("");
    }
     	   
    public static void fillMenue()
    {
        menuSearch       =  new String[3][2];
        menuSearch[0][0] = "Pizza Thunfisch";
        menuSearch[1][0] = "Pizza Margerita";
        menuSearch[2][0] = "Pizza Salami";
        menuSearch[0][1] = "Kaese, Tomaten, Thunfisch";
        menuSearch[1][1] = "Kaese, Tomaten";
        menuSearch[2][1] = "Kaese, Tomaten, Salami";
    }
	
    public static Vector finding(String[] stringIngrCopy) 
    { 
        int v = 0, j = 0 , counter = 0; 
      	
        Vector foundVec = new Vector();
      
        for (int i = 0; i < stringIngrCopy.length; i++) 
            if(stringIngrCopy[i] != null)
                counter++;

        for (j = 0; j < menuSearch.length; j++, v=0) 
        {    
            for (int i = 0; i < counter; i++) 
                if (menuSearch[j][1].indexOf(stringIngrCopy[i]) != -1) 
             	    v++; 

            if (v == counter)
                foundVec.addElement(new Integer(j));
        } 
   	
        return foundVec;
    } 
}
 
Hey FinalBrain!

Hab deine Antwort jetzt erst gelesen. Haben es aber hinbekommen 🙂!

Und zwar so:

Code:
public void finding()
   {
      int counter = 0;
      int counter2 = 0;
     
      for (int i = 0; i < stringIngrCopy.length; i++)
      {
         if(stringIngrCopy[i] != null)
         {
            counter++;
         }
      }

//das hier ist neu
      for (int i = 0; i < menuSearch.length; i++)
     {
         if(menuSearch[i] != null)
         {
            counter2++;
         }
     }
//
  
             
       for (int j = 0; j < menuSearch.length; j++)
       {   
         int v = 0;       
         
         for (int i = 0; i < counter; i++)
         {
            if (menuSearch[j][1].indexOf(stringIngrCopy[i]) != -1)
            {
               v++;
            }
         }
         
         if (v == counter)
         {
            foundVec.addElement(Integer.toString(j));
          }
      }

      if (foundVec.isEmpty() == true)
      {
         wg = new Warning(this, "Achtung", "Eine Pizza mit der von Ihnen gewählten Zutatenkombination bieten wir leider noch nicht an!", "Okay :-(");
      }
   }

😀

Haben jetzt noch eine Frage:

Wenn wir nach "Ei" suchen, findet er auch "Eisbergsalat" *g*....
 
habt ihr schonmal an reguläre Ausdrücke gedacht ?! (gibts ab Java 1.4. in der Klasse String)
Code:
String ei = "Ei";
String eisberg = "Eisbergsalat";
System.out.println(eisberg.matches(ei)); // ergibt false;
 
Würde es dann so lösen, dass du deine Daten nach der grösse der Silben eingibst:

menue[1][0] = "ei, eisbergsalat , einbahnstrassenklaus"


und controllierst dann ob

menue[1][0].charAt(menue[1][0].indexOf("ei") + 1) = ',';


...nur dann ist es dass "ei", welches du willst
 
oder du hast doch das Komma als Seperator, also anstelle von "Ei" suchst nach "Ei," ...

ist zwar ein ziemlicher Hack - ging aber 🙂
 
wie haben's mit lastIndexOf() + 1 versucht... aber es ging irgendwie nicht. außerdem gibt's dann n problem wenn das gesuchte wort am ende steht, weil dann gibt es lastIndexOf() + 1 ja gar net mehr...
 
Hmm..die Sache ist nicht ganz so einfach, hier die Komplettlösung..studiere es sorgfältig, dann kommst du bestimmt weiter 🙂

PS: Ansonsten ersetze einfach deine Finding Methode mit meiner :wink:

Code:
import java.util.*; 

public class PizzaHut 
{ 
    private static String[][] menuSearch; 
    private static String[]   auswahl; 
    
    public static void main(String[] args) 
    { 
        fillMenue(); 
    
        auswahl    = new String[10]; 
        auswahl[0] = "Kaese"; 
        auswahl[1] = "Tomaten"; 
        auswahl[2] = "Ei"; 
                   
        Vector ergebnis = finding(auswahl); 

        if (ergebnis.isEmpty()) 
            System.out.println("Keine Pizza mit dieser Komposition gefunden!"); 
        else 
        { 
            System.out.println("Die Zutaten gehoeren zu folgenden Pizzen: \n"); 
                   
            for (int i=0; i<ergebnis.size(); i++) 
                System.out.println(menuSearch[((Integer)(ergebnis.get(i))).intValue()][0]); 
        } 
       
        System.out.println(""); 
    } 
            
    public static void fillMenue() 
    { 
        menuSearch       =  new String[3][2]; 
        menuSearch[0][0] = "Pizza Phantasia"; 
        menuSearch[1][0] = "Pizza Margerita"; 
        menuSearch[2][0] = "Pizza Eierspass"; 
        menuSearch[0][1] = "Kaese, Tomaten, Eisberg"; 
        menuSearch[1][1] = "Kaese, Tomaten"; 
        menuSearch[2][1] = "Kaese, Tomaten, Ei"; 
    } 
    
    public static Vector finding(String[] stringIngrCopy) 
    { 
                  
        Vector foundVec = new Vector(); 
      	
      	int counter;
		
		for (counter = 0; auswahl[counter]!=null; counter++);
		
		
		for (int j=0;j<menuSearch.length;j++)
		{
			String teilString = "";
			int v = 0;
				
			for (int i=0;i<counter;i++)
			{
			
				for (int z = 0; z< menuSearch[j][1].length(); z++)
					if (menuSearch[j][1].charAt(z) != ',' && menuSearch[j][1].charAt(z) != ' ')
					{
						teilString = teilString + (""+menuSearch[j][1].charAt(z));
							
						if (z == menuSearch[j][1].length()-1)
						{
							if (teilString.indexOf(auswahl[i]) != -1)
								if (teilString.length() == auswahl[i].length())
									v++;
							
							teilString = "";
						}
					}
					else
					{
						if (teilString.indexOf(auswahl[i]) != -1)
							if (teilString.length() == auswahl[i].length())
								v++;
				
						teilString = "";
					}
						
					if (v == counter)
						foundVec.addElement(new Integer(j));	
			}
		
    	}
      
         return foundVec; 
    } 
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben