Kürzeste Wörter bestimmen

Diskutiere Kürzeste Wörter bestimmen im Allgemeine Java-Themen Forum; hallo zusammen bei folgende Code bekomme ich nicht das richtige Ergebnis.Es soll die kürzeste Wörter ausgeben, aber das macht er nicht ! z.B hier...

  1. clair1
    clair1 Neues Mitglied
    hallo zusammen
    bei folgende Code bekomme ich nicht das richtige Ergebnis.Es soll die kürzeste Wörter ausgeben, aber das macht er nicht !
    z.B hier System.out.println(getShortestWords("Dies ist so ein einfaches Beispiel"));
    soll nur "so" ausgeben aber er gibt "ist" und "so" aus
    Code (Java):
    //
    import java.util.ArrayList;
    import java.util.Arrays;

    import java.util.List;



    /**

     * Created by Clair on 12/19/2016.

     */


    public class Recursiv1 {

        public static void main(String[] args){

            String string="das ist ein  beispiel";

            List<String> list=getShortestWords(string);

          Object[] result=  list.toArray();

            System.out.println(Arrays.toString(result));

         

            System.out.println(getShortestWords("Dies ist so ein einfaches Beispiel"));

            System.out.println(getShortestWords(""));

        }



        private static List<String> getShortestWords(String string) {

            String[] strs=string.split(" ");

            return rec(strs,strs[0],1);

        }



        private static List<String> rec(String[] strs, String str,int index) {

            List<String> st= new ArrayList<>();

            if(index==strs.length)

                return  st;

            if(str.length()>strs[index].length()) {

                st.add(strs[index]);

                st.addAll( rec(strs, strs[index], index + 1));

                return st;

            }

            else if(str.length()<strs[index].length()){

                List<String> stringList = rec(strs, str, index + 1);

                if(stringList.size()>0 && stringList.iterator().next().length()<str.length())

                    return stringList;

                else {



                    st.addAll(stringList);

                    return st;

                }

            }

            else {

                st.add(str);

                st.addAll(rec(strs,strs[index],index+1));

                return st;

            }



        }

    }
     
     
    Zuletzt bearbeitet: 19. Dez. 2016
  2. Vielleicht hilft dir dieser Java-Kurs hier weiter --> (hier klicken)
  3. JCODA
    JCODA Aktives Mitglied
    Bitte verwende Code Tags: [code=java]//JAVA CODE HERE !!!!! [/code]

    Tipp: Du brauchst innerhalb der Rekursion keine Liste, und du benötigst innerhalb der Methode nur ein If-Else um den Längenvergleich durch zu füheren und ein If, um zu testen, ob du am Ende des Arrays angekommen bist.

    EDIT: OH, ich hab die Aufgabe falsch verstanden...
     
  4. JCODA
    JCODA Aktives Mitglied
    Ich hatte gehofft, man kann das viel eleganter lösen... Ich bin auch der Meinung es geht besser, aber das ist alles was ich hinbekommen habe:
    Code (Java):
    import java.util.ArrayList;
    import java.util.List;

    public class Recursiv10 {

        public static void main(String[] args) {

            System.out.println(getShortestWords("das ist ein beispiel"));
            System.out.println(getShortestWords("Dies ist so ein einfaches Beispiel"));
            System.out.println(getShortestWords(""));

        }

        private static List<String> getShortestWords(String string) {
            String[] strs = string.split(" ");
            return rec(strs, strs[0], 0);
        }


        private static List<String> rec(String[] strs, String shortest, int index) {
            List<String> result = new ArrayList<>();
            if (index == strs.length) {
                return result;
            }
            String current = strs[index];
            if (shortest.length() == current.length()) {
                result.add(current);
                List<String> subResult = rec(strs, shortest, index + 1);          
                if (!subResult.isEmpty() && subResult.get(0).length() < shortest.length()) {
                    result = subResult;
                } else {
                    result.addAll(subResult);
                }
                return result;
            } else if (shortest.length() < current.length()) {
                return rec(strs, shortest, index + 1);
            } else if (shortest.length() > current.length()) {
                return rec(strs, current, index);
            }

            return result;

        }

    }
     
  5. clair1
    clair1 Neues Mitglied
    die liste gehört zu Aufgabenstellung
     
  6. clair1
    clair1 Neues Mitglied
    und danke für deine Hilfe
     
  7. stg
    stg Bekanntes Mitglied
    Warum denn überhaupt mit Rekursion und Tralala und nicht ganz simpel halten? Dann versteht man auch auf Anhieb, was der Code macht.

    Code (Java):

    private static List<String> getShortestWords(String string) {
        int minLengthFound = Integer.MAX_VALUE;
        List<String> result = new ArrayList<>();
        for(String str : string.split(" ")) {
            int currentLength = str.length();
            if(currentLength < minLengthFound) {
                minLengthFound = currentLength;
                result.clear();
                result.add(str);
            } else if(currentLength == minLengthFound) {
                result.add(str);
            }
        }
        return result;
    }
     
    ...kann man natürlich noch aufhübschen, wenn man CleanCode mag. Soll nur ein erster Ansatz sein.
     
  8. clair1
    clair1 Neues Mitglied
    die aufgabe ist mit Rekursion und man darf keine schleife verwenden
     
  9. Flown
    Flown Administrator Mitarbeiter
    Da ja schon so schöne Lösungen da stehn, evtl was mit Endrekursion?
    Code (Java):
    private static List<String> getShortestWords(String string) {
      Objects.requireNonNull(string);
      return getShortestWords(string.split("\\s+"), 0, Integer.MAX_VALUE, new ArrayList<>());
    }

    private static List<String> getShortestWords(String[] words, int i, int shortestLength, List<String> shortestWords) {
      if (i == words.length) {
        return shortestWords;
      }
      final String word = words[i];
      final int wordLength = word.length();
      final int compare = Integer.compare(wordLength, shortestLength);
      if (compare < 0) {
        shortestWords.clear();
      }
      if (shortestWords.isEmpty() || compare == 0) {
        shortestWords.add(word);
        return getShortestWords(words, i + 1, wordLength, shortestWords);
      }
      return getShortestWords(words, i + 1, shortestLength, shortestWords);
    }
     
  10. JCODA
    JCODA Aktives Mitglied
    Hätte ich mir auch gewünscht, aber ich dachte, die Methoden-Signatur ist ebenfalls vorgegeben.
     
Die Seite wird geladen...

Kürzeste Wörter bestimmen - Ähnliche Themen

Algortihmus: Kürzeste Folge zu einer Zahl
Algortihmus: Kürzeste Folge zu einer Zahl im Forum Java Basics - Anfänger-Themen
Kürzester Weg (Projekt)
Kürzester Weg (Projekt) im Forum Hausaufgaben
Schiffangaben (kürzestes/längstes)
Schiffangaben (kürzestes/längstes) im Forum Java Basics - Anfänger-Themen
Optimierung kürzester Weg im Warenlager
Optimierung kürzester Weg im Warenlager im Forum Allgemeine Java-Themen
Algorithmus für kürzesten Weg mit Wegpunkten
Algorithmus für kürzesten Weg mit Wegpunkten im Forum Allgemeine Java-Themen
Thema: Kürzeste Wörter bestimmen