Kürzeste Wörter bestimmen

Dieses Thema Kürzeste Wörter bestimmen im Forum "Allgemeine Java-Themen" wurde erstellt von clair1, 19. Dez. 2016.

Thema: Kürzeste Wörter bestimmen hallo zusammen bei folgende Code bekomme ich nicht das richtige Ergebnis.Es soll die kürzeste Wörter ausgeben, aber...

  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 das kostenlose Training 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.
     
  11. Schau dir jetzt hier den Kurs an und lerne Java zu programmieren: --> Hier klicken, um mehr zu erfahren (Klick)