Kürzeste Wörter bestimmen

clair1

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
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:
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...
 
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:
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;

    }

}
 
Warum denn überhaupt mit Rekursion und Tralala und nicht ganz simpel halten? Dann versteht man auch auf Anhieb, was der Code macht.

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.
 
Da ja schon so schöne Lösungen da stehn, evtl was mit Endrekursion?
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);
}
 

Zurück
Oben