komische NoSuchElementException

Hey,
ich habe mich mal an einer Aufgabe des BWINF versucht(https://bwinf.de/bundeswettbewerb/37-bwinf/1-runde/material-371/), stoße jedoch auf eine mir unerklärliche Fehlermeldung.
Ich habe ansich schn eine Idee wie ich das ganze Lösen will, aber, wie gesagt, steht mir die Fehlermeldung in Weg.
Soweit ich das verstehe findet es eine Zeile(ein Element in Zeile 44 nicht), nachdem ich den if Befehl über mehrere Zeile verteilt habe, um zu sehen, was nicht funktioniert, schien es so, als ob die Zeile datei.nextLine().charAt(1) das Problem sei, mit einem sysout konnte ich mir die aber ohne probleme ausgeben lassen. Hat wer ne Lösung?

Achso die Datei Alphabet.txt:https://bwinf.de/fileadmin/user_upload/BwInf/2018/37/1._Runde/Material/woerterliste.txt

Danke Im Vorraus
Java:
package runde1;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

import javax.swing.JOptionPane;

public class Aufgabe1 {

    @SuppressWarnings("unchecked")
    public static void main(String[] args)
    {
        boolean next = false;
        String alphabet = "abcdefghijklmnopqrstuvwxyz";
        String upperAlphabet = alphabet.toUpperCase();
        Scanner datei = null;
        ArrayList[] ListArray = new ArrayList[26];
        for(int i = 0; i< ListArray.length; i++)
        {
            ListArray[i] = new ArrayList<String>();
        }
        try
        {
            datei = new Scanner(new File("rsc/Alphabet.txt"));
        }catch(IOException ex)
        {
            JOptionPane.showMessageDialog(null, "Die Datei 'Alphabet.txt' konnte nicht geladen werden.", "Fehler", JOptionPane.WARNING_MESSAGE);
           
        }
        System.out.println(datei.nextLine().charAt(1));
        while(datei.hasNext() && !(datei.next().equals(null)));
        {
            for(int i = 1; i<=alphabet.length();i++)
            {
                String temp = datei.nextLine();
                if(i == 1)
                {
                    next = false;
                }
                while(!next)
                {
                    if(datei.nextLine().charAt(1) == alphabet.charAt(i)||datei.nextLine().charAt(1) == upperAlphabet.charAt(i))
                    {
                   
                        ListArray[i].add(temp);
                        System.out.println(temp);
                        next = true;
                    }
                }
            }
        }
       

    }

}
 

Meniskusschaden

Top Contributor
Die Zeile while(datei.hasNext() && !(datei.next().equals(null))); wird so oft durchlaufen, bis alle Zeichen eingelesen wurden (leerer Schleifenkörper).
Danach versuchst du in der Zeile String temp = datei.nextLine(); ungeprüft die nächste Zeile zu lesen, was logischerweise fehlschlägt, weil du ja bereits vorher alles eingelesen hast.
 
Erstmal entschuldigung für die späte Antwort, ich hatte noch andere Projekte im Kopf,
ich hatte zwar den leeren Schleifenkörper entfernt, dennoch lief mein Script nicht so wie geplant.
Weil es mir dann zu blöd war nach dem Fehler zu suchen, habe ich ein neues Script geschrieben.
Leider läuft das auch nicht ganz so wie geplant.
Ich gebe dem Script am Anfang das getwistete Wort "enthält"(entählt) und bekomme als Ausgabe "eiltest".
Da ich keinen blassen Schimer habe, warum das so ist, frage ich hier nach.
Code:
package aufgabe1b;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Einlesen {
    public static ArrayList<String>[] read(String file)
    {
        String alphabet = "abcdefghijklmnopqrstuvwxyzäöü";
        Scanner words = null;
        try {
            words = new Scanner(new File("rsc/" +file));
        } catch (FileNotFoundException ex)
        {
            System.out.println("Die Datei : " + file +" konnte nicht geladen werden!");
            ex.printStackTrace();
        }
        @SuppressWarnings("unchecked")
        ArrayList<String>[] wordlist = (ArrayList<String>[])new ArrayList[29];
        for (int i = 0; i < 29; i++) {
            wordlist[i] = new ArrayList<String>();
        }
        while(words.hasNext())
        {
            String wort = "";
            for(int i = 0 ; i< 29; i++)
            {
                if(words.hasNext())
                {
                    wort = words.next();
                    if(wort.toLowerCase().charAt(0) == alphabet.charAt(i))
                    {
                        wordlist[i].add(wort);
                    }
                }
               
            }
           
        }
        return wordlist;
    }
}
Hier der Code des eigentlichen Entwisters:
Java:
package aufgabe1b;

import java.util.ArrayList;
import java.util.Iterator;

public class Entwister {
    public static String Entwist(String string)
    {
       
        String s = string.replace(" ", "");
        if(s.equals(null))
            return null;
        char sBegin = s.toLowerCase().charAt(0);
        System.out.println(sBegin);
        //Variablen definieren
        String choice = "";
        String alphabet = "abcdefghijklmnopqrstuvwxyzäöü";
        //Wenn 3 Buchstaben returnen
        if(s.length() <= 3 && s.length() > 0)
            return s;
        ArrayList<String>[] wordlist = Einlesen.read("Wordlist.txt");
        for(int i = 0; i< 29; i++)
        {
            //In richtigem anfangsbuchstaben suchen -> nicht so performacelastig
            if( sBegin == alphabet.charAt(i))
            {
                //Durch die Arraylist iterieren
                Iterator<String> it = wordlist[i].iterator();
                for(int j = 0; j < wordlist[i].size();j++)
                {
                    //Nach richtiger Länge filtern
                    String next = it.next();
                    if(next.length() == s.length())
                    {
                        if(!(next.equals(null)))
                        {
                            choice += " " + next;
                        }
                    }
                   
                }
                String[] scndChoice = choice.split(" ");
                if(scndChoice.length == 1)
                {
                    return choice;
                }
                else if(scndChoice.length > 1)
                {
                    for(int j = 0; j< scndChoice.length;j++)
                    {
                        if(!scndChoice[j].equals(""))
                        {
                            //Nach ENdbuchstaben filtern
                            if(scndChoice[j].toLowerCase().charAt(scndChoice[j].length() -1) == s.charAt(s.length() -1))
                            {
                                ArrayList<String> thrdChoice = new ArrayList<String> ();
                                thrdChoice.add(scndChoice[j]);
                                String last = thrdChoice.toString();
                                String[] toBeReturned = last.split(" ");
                                if(toBeReturned.length > 1)
                                {
                                    ArrayList<String> untilTrue = new ArrayList<String>();
                                    for(String str : toBeReturned)
                                        untilTrue.add(str);
                                    while(untilTrue.size()>1)
                                    {
                                        String temp = "";
                                        Iterator<String> untilTrueIt = untilTrue.iterator();
                                        temp = untilTrueIt.next();
                                            for(int k = 2; k < s.length();k++)
                                            {
                                               
                                                if(!(Entwister.containsString(temp, Character.toString(s.charAt(k)))))
                                                {
                                                    untilTrue.remove(temp);
                                                }

                                            }
                                    }
                                    return untilTrue.toString();
                                       
                                }
                                return toBeReturned[0].replace("[", "").replace("]", "");
                            }
                        }
                    }
                }
                else
                {
                    return null;
                }
            }
        }
        return null;
    }
    private static boolean containsString( String s, String subString )
    {
        return s.indexOf( subString ) > -1 ? true : false;
    }
   
   

}
Die Main lasse ich weg, die kann man sich ja denken:
System.out.println(Entwister.Entwist("entählt"));

Hat jemand eine Idee?
 

Meniskusschaden

Top Contributor
Da ich keinen blassen Schimer habe, warum das so ist,
In dem Fall solltest du es debuggen, indem du dir an signifikaten Stellen die Daten ansiehst. Entweder mit dem Debugger deiner IDE oder mit temporär eingebauten System.out.println()-Anweisungen. So kommt man solchen Fehlern meistens relativ leicht auf die Spur.

Das hier stammt aus deiner Klasse Einlesen:
Java:
            for (int i = 0; i < 29; i++) {
                if (words.hasNext()) {
                    wort = words.next();
                    if (wort.toLowerCase().charAt(0) == alphabet.charAt(i)) {
                        wordlist[i].add(wort);
                    }
                }
            }
In der ersten Iteration der for-Schleife, prüfst du, ob das Wort mit a beginnt. Falls es nicht mit a beginnt, ignorierst du es. In den nächsten Iterationen dann dasselbe mit b, c, etc.. Da nicht immer ein Wort mit a, dann eines mit b, dann eines mit c kommt, ignorierst du die meisten Wörter.

Kannst du dich bitte klarer ausdrucken? Ich verstehe nicht, was du vor hast, bzw. willst..
Ein paar zusätzliche Hinweise wären wirklich nicht schlecht gewesen. Auf dem Link im Eröffnungsposting muss man erst einmal suchen, worum es überhaupt geht. Dass Aufgabe 2 gemeint ist, kann man aus dem package-Namen aufgabe1b ja auch nicht so direkt ableiten.;)
 
Erstmal danke für eure schnelle, konstruktive Kritik.
@Javinner :
Ich möchte ein eingegebenes, getwistetes Wort(bei dem Buchstaben in der mitte vertauscht sind) wieder entwisten.
Um das gut umzusetzten habe ich eine Liste mit etwa 300.000 deutschen Wörtern.Ich möchte um die performanceLast in Grenzen zu halten diese Liste in 29 verschiedene ArrayLists aufteilen(26 für a-z und 3 für ö,ä und ü)
Dannach prüfe ich erstmal mit welchem Buchstaben das getwistete Wort anfängt und suche in der entsprechenden ArrayList nach wörtern, die die gleiche Länge wie das Wort haben. Wenn ich dann nur noch ein Wort übrighabe, gebe ich dieses zurück, wenn nicht filtere ich nach Endbuchstaben, wenn dann nur noch eines übrig ist, gebe ich dieses zurück, wenn nicht schaue ich ob die Auswahl an wörtern den zweiten BUchstaben des getwisteten Wortes enthalten, dann nach dem dritten(dazu bin ich noch nicht gekommen) usw.
@Meniskusschaden:
n dem Fall solltest du es debuggen, indem du dir an signifikaten Stellen die Daten ansiehst
temporär sysouts hatte ich schon, die habe ich aber entfernt, weil das m.M.n. überflüssig war.
Debuggen habe ich vor dem Post auch schon gemacht, nur bin ich dabei nicht darauf gekommen, dass ich diese zwei verschachtelten if-Blöcke so schlecht geschrieben habe, das hat also auch nichts geholfen.
Dass Aufgabe 2 gemeint ist, kann man aus dem package-Namen aufgabe1b ja auch nicht so direkt ableiten
:(Das liegt daran, dass ich mit der Aufgabe 2 zuerst angefangen habe, da ich zerst keine Idee für Aufgabe 1 hatte.
Ich muss mir dann irgendwann angewöhnt haben, die Aufgabe 2 als Aufgabe 1 zu sehen.
Sind die if Schleifen so besser?
[CODE = JAVA]
while(words.hasNext())
{
String wort = "";
wort = words.next();
for(int i = 0; i < 29; i ++)
{
if(wort.toLowerCase().charAt(1)==alphabet.charAt(i))
{
wordlist.add(wort)
}
}
}
[/CODE]
 

mihe7

Top Contributor
Ich möchte um die performanceLast in Grenzen zu halten diese Liste in 29 verschiedene ArrayLists aufteilen(26 für a-z und 3 für ö,ä und ü)
Du möchtest erst mal, dass das Ding funktioniert. Halte Dich nicht mit Optimierungen auf; die helfen Dir nicht weiter, sondern sorgen für Probleme.

Vergiss die Aufteilerei vorerst und löse das wirkliche Problem. Wenn das funktioniert UND es zu langsam sein sollte, dann kannst Du Dir immer noch Gedanken machen.

Trotzdem noch kurz zum Code:
1. müsste es nicht wordlist[i].add(wort); heißen?
2. Du musst die restlichen Buchstaben nicht durchlaufen, wenn Du den Anfangsbuchstaben schon gefunden hast?[/plain]
 
Trotzdem noch kurz zum Code:
1. müsste es nicht wordlist.add(wort); heißen?
2. Du musst die restlichen Buchstaben nicht durchlaufen, wenn Du den Anfangsbuchstaben schon gefunden hast?[/plain]
Ja hätte es. Ich war wohl schon ziemlich müde, als ich den Code hier gepostet habe.
Nachdem ich das und ein paar andere Änderungen vorgenommen habe(ich weiß nicht mehr welche, es waren irgendwelche Kleinigkeiten in der
Java:
package aufgabe1b;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Einlesen {
    public static ArrayList<String>[] read(String file)
    {
        String alphabet = "abcdefghijklmnopqrstuvwxyzäöü";
        Scanner words = null;
        try {
            words = new Scanner(new File("rsc/" +file));
        } catch (FileNotFoundException ex)
        {
            System.out.println("Die Datei : " + file +" konnte nicht geladen werden!");
            ex.printStackTrace();
        }
        @SuppressWarnings("unchecked")
        ArrayList<String>[] wordlist = (ArrayList<String>[])new ArrayList[29];
        for (int i = 0; i < 29; i++) {
            wordlist[i] = new ArrayList<String>();
        }

        while(words.hasNext())
        {
            String wort = "";
            wort = words.next();
            boolean found = false;
            for(int i = 0; i < 29; i ++)
            {
             
                if(wort.toLowerCase().charAt(0)==alphabet.charAt(i) && !found)
                {
                    wordlist[i].add(wort);
                    found = true;
                }
            }
        }
        return wordlist;
    }
}
, stehe ich noch immer vor einem Problem.
Ich habe in meiner
Code:
package aufgabe1b;

import java.util.ArrayList;
import java.util.Iterator;

public class Entwister {
   public static String Entwist(String string) throws InterruptedException
   {
     
       String s = string.replace(" ", "");
       if(s.equals(null))
           return null;
       char sBegin = s.toLowerCase().charAt(0);
       System.out.println(sBegin);
       //Variablen definieren
       String choice = "";
       String alphabet = "abcdefghijklmnopqrstuvwxyzäöü";
       //Wenn 3 Buchstaben returnen
       if(s.length() <= 3 && s.length() > 0)
           return s;
       ArrayList<String>[] wordlist = Einlesen.read("Wordlist.txt");
       for(int i = 0; i< 29; i++)
       {
           //In richtigem anfangsbuchstaben suchen -> nicht so performacelastig
           if( sBegin == alphabet.charAt(i))
           {
               //Durch die Arraylist iterieren
               Iterator<String> it = wordlist[i].iterator();
             
                 
               for(int j = 0; j < wordlist[i].size();j++)
               {
                   //Nach richtiger Länge filtern
                   String next = it.next();
                   if(next.length() == s.length())
                   {
                     
                       if(!(next.equals(null)))
                       {
                           choice += " " + next;
                       }
                   }
                 
               }
               String[] scndChoice = choice.split(" ");
               for(int j = 0; j < scndChoice.length; j++)
               {
                   scndChoice[j].replaceAll(" ", "");
               }
             
               if(scndChoice.length == 1)
               {
                   return choice;
               }
               else if(scndChoice.length > 1)
               {
                   for(int j = 0; j< scndChoice.length;j++)
                   {
                       if(!scndChoice[j].equals("")||!scndChoice[j].equals(null)||scndChoice[j].equals(" "))
                       {
                           //Nach ENdbuchstaben filtern
                           if(scndChoice[j].toLowerCase().charAt(scndChoice[j].length() -1) == s.toLowerCase().charAt(s.length() -1))
                           {
                             
                               ArrayList<String> thrdChoice = new ArrayList<String> ();
                               thrdChoice.add(scndChoice[j]);
                               String last = thrdChoice.toString();
                               String[] toBeReturned = last.split(" ");
                               if(toBeReturned.length > 1)
                               {
                                   ArrayList<String> untilTrue = new ArrayList<String>();
                                   for(String str : toBeReturned)
                                       untilTrue.add(str);
                                   while(untilTrue.size()>1)
                                   {
                                       String temp = "";
                                       Iterator<String> untilTrueIt = untilTrue.iterator();
                                       temp = untilTrueIt.next();
                                           for(int k = 2; k < s.length();k++)
                                           {
                                             
                                               if(!(Entwister.containsString(temp, Character.toString(s.charAt(k)))))
                                               {
                                                   untilTrue.remove(temp);
                                               }

                                           }
                                   }
                                   return untilTrue.toString();
                                     
                               }
                               return toBeReturned[0].replace("[", "").replace("]", "");
                           }
                       }
                   }
               }
               else
               {
                   return null;
               }
           }
       }
       return null;
   }
   private static boolean containsString( String s, String subString )
   {
       return s.indexOf( subString ) > -1 ? true : false;
   }
 
 

}
Die Strings mit dem richtigen Anfangsbuchstaben nach der länge des Strings gefiltert:
Java:
for(int j = 0; j < wordlist[i].size();j++)
                {
                    //Nach richtiger Länge filtern
                    String next = it.next();
                    if(next.length() == s.length())
                    {
                     
                        if(!(next.equals(null)))
                        {
                            choice += " " + next;
                        }
                    }
                 
                }
                String[] scndChoice = choice.split(" ");
Dennoch bekomme ich wenn ich die Zeile:
Java:
                            if(scndChoice[j].toLowerCase().charAt(s.length() -1) == s.toLowerCase().charAt(s.length() -1))
ausführe, eine unschöne StringIndexOutOfBoundsException(String index out of range: 6), mir ist klar, dass das daran liegt, dass der String zu kurz ist, aber ich habe eigentlich ja schon vorher nach der Länge gefiltert. Wenn ich diese Zeile dann umgehe, indem ich anstatt der "charAt(s.lenght -1)" auf der linken Seite der prüfung "charAt(secondChoice[j].lenght() -1)" schreibe, bekomme ich immer noch dieselbe Fehlermeldung(java.lang.StringIndexOutOfBoundsException: String index out of range: -1).
Kann mir jemand helfen?

//Edit: komischerweise hilft es mir nichts, wenn ich der Zeile "if(!scndChoice[j].equals("")||!scndChoice[j].equals(null)||!scndChoice[j].equals(" "))" noch die weitere Abfrage "!(scndChoice[j].length() <=3)"
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Äh, Dein j iteriert über die Wortlisten (ich glaube, 29 waren es). Du splittest einen String über Leerzeichen, z. B. "a b c", dann enthält das Array scndChoice 3 Elemente. Wenn Du mit scndChoice[j] darauf zu greifst, spielt die Länge der einzelnen Strings keine Rolle...

Nachtrag: habe ich schon erwähnt, dass
Du möchtest erst mal, dass das Ding funktioniert. Halte Dich nicht mit Optimierungen auf; die helfen Dir nicht weiter, sondern sorgen für Probleme.

Vergiss die Aufteilerei vorerst und löse das wirkliche Problem. Wenn das funktioniert UND es zu langsam sein sollte, dann kannst Du Dir immer noch Gedanken machen.
 
Kann sein, dass ich mich irre, aber der ForBlock "for(int j = 0; j < wordlist.size();j++)" endet in Zeile 44, der auf den ich mich beziehe startet in Zeile 57.

//Edit: ich probiere es mal ohne Optimierung
 
Zuletzt bearbeitet:
@mihe7 Ich habe das ganze jetzt mal unkompliziert und ohne Optimierung gemacht:
Java:
package aufgabe2b;


import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Einlesen {
    public static ArrayList<String> read(String file)
    {
        Scanner words = null;
        try {
            words = new Scanner(new File("rsc/" +file));
        } catch (FileNotFoundException ex)
        {
            System.out.println("Die Datei : " + file +" konnte nicht geladen werden!");
            ex.printStackTrace();
        }
        ArrayList<String> wordlist = new ArrayList<String>();

        while(words.hasNext())
        {
            String wort = "";
            wort = words.next();
            wordlist.add(wort);
        }
        return wordlist;
    }
}
Java:
package aufgabe2b;


import java.util.ArrayList;
import java.util.Iterator;

public class Entwister {
    public static String Entwist(String string)
    {
      
        String s = string.replace(" ", "");
        if(s.equals(null))
            return null;
        char sBegin = s.toLowerCase().charAt(0);
        System.out.println(sBegin);
        //Wenn 3 Buchstaben returnen
        if(s.length() <= 3 && s.length() > 0)
            return s;
        ArrayList<String> wordlist = Einlesen.read("Wordlist.txt");
        ArrayList<String> wortFinden = new ArrayList<String>();
        Iterator<String> it = wordlist.iterator();
        while(it.hasNext())
        {
            String wort = it.next();
            if(s.charAt(0)==wort.charAt(0))
            {
                wortFinden.add(wort);
            }
        }
        Iterator<String> finalit = wortFinden.iterator();
        while(finalit.hasNext())
        {
            String wort = finalit.next();
            if(wort.length() != s.length())
                wortFinden.remove(wort);
            if(wort.charAt(s.length() -1) != s.charAt(s.length() - 1))
                wortFinden.remove(wort);
            for(int i = 2; i < s.length() -1;i++)
            {
                if(!containsChar(wort, s.charAt(i)))
                    wortFinden.remove(wort);
            }
        }
        return finalit.next();
    }
    private static boolean containsChar( String s, char subChar )
    {
        return s.indexOf( Character.toString(subChar) ) > -1 ? true : false;
    }
  
  

}
Java:
System.out.println(Entwister.Entwist("Afpel"));
Und ich stoße trotzdem auf die gleiche exception:
"
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4
at java.lang.String.charAt(Unknown Source)
at aufgabe2b.Entwister.Entwist(Entwister.java:36)
at aufgabe2b.Main.main(Main.java:6)"
Obwohl ich auch hier auf die länge geprüft habe.
Kann jemand helfen?
 
@mihe7 Danke für deinen Tipp das ganze ohne die Optimierung zu machen, jetzt klappt alles.
Nebenbei ist mir aufgefallen, dass die Optimierung eigentlich gar nicht so viel geholfen hätte, da ich jedes mal, wenn ich die Entwisten Methode aufgerufen habe, alle 300000 Strings der Datei Wordlist.txt durchlaufen habe.
Ich werde mich warscheinlich noch an einer wirklichen Optimierung veruchen, wenn was nicht klappt und ich den Fehler einfach nicht finde, melde ich mich.
Falls es wen interessiert hier der Code:
Java:
package aufgabe2b;


import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Einlesen {
    public static ArrayList<String> read(String file)
    {
        Scanner words = null;
        try {
            words = new Scanner(new File("rsc/" +file));
        } catch (FileNotFoundException ex)
        {
            System.out.println("Die Datei : " + file +" konnte nicht geladen werden!");
            ex.printStackTrace();
        }
        ArrayList<String> wordlist = new ArrayList<String>();

        while(words.hasNext())
        {
            String wort = "";
            wort = words.next();
            wordlist.add(wort);
        }
        return wordlist;
    }
}
Java:
package aufgabe2b;


import java.util.ArrayList;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class Entwister {
    public static String Entwist(String string)
    {
       
        String s = string.replace(" ", "");
        if(s.equals(""))
            return null;
        char sBegin = s.charAt(0);
        System.out.println(sBegin);
        //Wenn 3 Buchstaben returnen
        if(s.length() <= 3 && s.length() > 0)
            return s;
        ArrayList<String> wordlist = Einlesen.read("Wordlist.txt");
        ArrayList<String> wortFinden = new ArrayList<String>();
        Iterator<String> it = wordlist.iterator();
        while(it.hasNext())
        {
            String wort = it.next();
            if(s.charAt(0)==wort.charAt(0))
            {
                wortFinden.add(wort);
            }
        }
        String remove = "";
        @SuppressWarnings("rawtypes")
        Iterator finalit = wortFinden.iterator();
        while(finalit.hasNext())
        {
            String wort = finalit.next().toString();
            if(wort.length() != s.length())
                remove += " "+wort;
            else if(wort.charAt(wort.length() -1) != s.charAt(s.length() - 1))
                remove += " "+wort;
            else if(1 == 1)
            {
                for(int i = 2; i < s.length() -1;i++)
                {   
                        if(!containsChar(wort, s.charAt(i)))
                            remove += " "+wort;
                }
            }
           
        }
        String toBeRemoved[] = remove.split(" ");
        for(String str : toBeRemoved)
        {
            str.replace(" ", "");
            wortFinden.remove(str);
        }
        Iterator<String> word = wortFinden.iterator();
        try
        {
            return word.next();
        }catch(NoSuchElementException exc)
        {
            System.out.println("Kein Treffer gefunden");
        }
        return null;
       
    }
    private static boolean containsChar( String s, char subChar )
    {
        return s.indexOf( Character.toString(subChar) ) > -1 ? true : false;
    }
   
   

}
Java:
package aufgabe2b;

public class Main {
    public static void main(String[] args)
    {
        System.out.println(Entwister.Entwist("abc"));
    }
}
Danke an Alle, die mir geholfen haben.
 

Javinner

Top Contributor
@BinAmJavaLernen
Geht aber auch kürzer..
Meine Vorgehensweise ist:
Sortiere jedes Wort im Array aufsteigend nach dem Alphabet. Sortiere das gesuchte Wort, in deinem Fall das Verdrehte, ebenso nach Alphabet. Gehe durch die Liste und prüfe auf Übereinstimmung, Informationsausgabe.
Schau dir das hier an:
Java:
public class Enttwister
{

    public static void main(String[] args)
    {
        List<String> bibliothek = new ArrayList<>();
        bibliothek.add("Apfel");
        bibliothek.add("Birne");
        bibliothek.add("Melone");
        bibliothek.add("Gurke");
    
        //Nachtraeglich geaendert, da die Liste bibliothek ungluecklicher Weise mitsortiert wurde
        List<String> liste = new ArrayList<>(bibliothek);

        String eingabe = "Geurk";
        int test_eingabe = enttwiste(eingabe, liste);
        if (test_eingabe == - 1)
        {
            System.out.print("Wort exsistiert nicht");
        } else
        {
            System.out.print(String.format(Locale.GERMAN, "Das Wort %s ist im Array auf Position %d vorhanden und wird sonst %s genannt%n", eingabe, test_eingabe, bibliothek.get(test_eingabe)));
        }
    }

    private static int enttwiste(String eingabe, List<String> bibliothek)
    {
        List<String> sortierte_liste = sortiere(bibliothek);
        String eingabe_sortiert = sortiereWort(eingabe);
        for (int i = 0; i < sortierte_liste.size(); i++)
        {
            if (sortierte_liste.get(i).equals(eingabe_sortiert))
            {
                return i;
            }
        }
        return -1;
    }

    private static List<String> sortiere(List<String> liste)
    {
        List<String> x = liste;
        for (int i = 0; i < x.size(); i++)
        {
            String zusortieren = sortiereWort(x.get(i));
            x.remove(i);
            x.add(i, zusortieren);
        }
        return x;
    }

    private static String sortiereWort(String eingabe)
    {
        char[] x = eingabe.toCharArray();
        StringBuilder sb = new StringBuilder();
        Arrays.sort(x);
        for (char c : x)
        {
            sb.append(c);
        }
        return sb.toString();
    }

}

/** Output */
Das Wort Geurk ist in Bibliothek auf Position 3 vorhanden und wird sonst Gurke genannt
 
Zuletzt bearbeitet:

mihe7

Top Contributor
@BinAmJavaLernen schön, wenn es jetzt klappt. Noch der Vollständigkeit halber:
Code:
          if(wort.length() != s.length())
                wortFinden.remove(wort);
            if(wort.charAt(s.length() -1) != s.charAt(s.length() - 1))
                wortFinden.remove(wort);
Du entfernst hier zwar wort aus der Liste, wenn die Längen nicht übereinstimmen, machst dann aber mit dem Vergleich weiter. Hier fehlt einfach ein else vor dem zweiten if.
 

Meniskusschaden

Top Contributor
Meine Vorgehensweise ist:
Sortiere jedes Wort im Array aufsteigend nach dem Alphabet. Sortiere das gesuchte Wort, in deinem Fall das Verdrehte, ebenso nach Alphabet. Gehe durch die Liste und prüfe auf Übereinstimmung, Informationsausgabe.
Das ist aber noch nicht ganz korrekt, weil Anfangs- und Endbuchstaben exakt passen müssen. In deinem Programm würden auch falsche Wörter wie z.B. "Apfle" gefunden werden.
 
@BinAmJavaLernen schön, wenn es jetzt klappt. Noch der Vollständigkeit halber:
Code:
          if(wort.length() != s.length())
                wortFinden.remove(wort);
            if(wort.charAt(s.length() -1) != s.charAt(s.length() - 1))
                wortFinden.remove(wort);
Du entfernst hier zwar wort aus der Liste, wenn die Längen nicht übereinstimmen, machst dann aber mit dem Vergleich weiter. Hier fehlt einfach ein else vor dem zweiten if.
Ja das ist mir nach dem posten auch aufegfallen. Ich habe den entsprechenden Code geändert zu:
Code:
while(finalit.hasNext())
        {
            String wort = finalit.next().toString();
            if(wort.length() != s.length())
                remove += " "+wort;
            else if(wort.charAt(wort.length() -1) != s.charAt(s.length() - 1))
                remove += " "+wort;
            else
            {
                for(int i = 2; i < s.length() -1;i++)
                {   
                        if(!containsChar(wort, s.charAt(i)))
                            remove += " "+wort;
                }
            }
           
        }
        String toBeRemoved[] = remove.split(" ");
        for(String str : toBeRemoved)
        {
            str.replace(" ", "");
            wortFinden.remove(str);
        }
        Iterator<String> word = wortFinden.iterator();
        try
        {
            return word.next();
        }catch(NoSuchElementException exc)
        {
            JOptionPane.showMessageDialog(null, "Kein Treffer gefunden", "Kein Treffer", JOptionPane.INFORMATION_MESSAGE);
        }
        return null;
Ich hoffe mal da sind keine Fehler mehr drinnen. Bei mir zumindest haben wörter wie "Urlaubsgewusel" oder Sätze ohne Satzzeichen(das regle ich morgen noch) funktioniert.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J ObjectOutputStream writeChars, komische Zeichen nur in 1. Zeile Java Basics - Anfänger-Themen 2
R Komische Zeichen in Java Java Basics - Anfänger-Themen 5
L Compiler-Fehler Komische Ausgabe meines Programms Java Basics - Anfänger-Themen 6
D Methoden ArrayList Rückgabe bringt komische Werte Java Basics - Anfänger-Themen 12
P Erste Schritte Console - Sehr komische Ausgabe! Java Basics - Anfänger-Themen 3
S Komische ANT Warnungen Java Basics - Anfänger-Themen 4
B Komische Strings Java Basics - Anfänger-Themen 2
B komische NullPointerException Java Basics - Anfänger-Themen 5
T JDom komische Ausgabe Java Basics - Anfänger-Themen 4
E komische endlosschleife Java Basics - Anfänger-Themen 6
M txt-Datei schreiben: Es erscheinen komische Kästchen Java Basics - Anfänger-Themen 4
R BufferedWriter macht komische Zeichen Java Basics - Anfänger-Themen 3
S Komische Feldermeldung bei Forschleife Java Basics - Anfänger-Themen 3
X Wie kann das den sein? Komische Variablenbelegung! Java Basics - Anfänger-Themen 5
C ok... der spuckt irgendwie nur komische zeichen aus.... Java Basics - Anfänger-Themen 2
G komische Ausgabe mit @.@. Java Basics - Anfänger-Themen 4
B Komische Array Ausgabe Java Basics - Anfänger-Themen 6
G ArrayList mit ArrayList als Inhalt - komische Sortierung? Java Basics - Anfänger-Themen 12
G CSV Datei einlesen & komische Zeichen Java Basics - Anfänger-Themen 5
G komische sache Java Basics - Anfänger-Themen 4
C Komische Zeichen beim Lesen aus einer .reg-Datei Java Basics - Anfänger-Themen 2
M Komische Syntax bei Double-Buffering-Beispiel Java Basics - Anfänger-Themen 2
B komische NumberFormatException beim DezimalToBinär-Rechner Java Basics - Anfänger-Themen 4
E Komische Syntax Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
S Input/Output NoSuchElementException Java Basics - Anfänger-Themen 7
D Scanner- Exception NoSuchElementException Java Basics - Anfänger-Themen 2
S NoSuchElementException ? Java Basics - Anfänger-Themen 0
H NoSuchElementException Java Basics - Anfänger-Themen 2
D java.util.NoSuchElementException: No line found Java Basics - Anfänger-Themen 11
D Lesen aus Datei (java.util.NoSuchElementException) Java Basics - Anfänger-Themen 22
Z NoSuchElementException - Scanner.nextLine() Java Basics - Anfänger-Themen 4
K Arraylist und NoSuchElementException Java Basics - Anfänger-Themen 3
M NoSuchElementException/Enumeration Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben