Antworte auf:  Wörter einer spezifizierten Länge zurückgeben von arhzz
Forum:  Programmieren, moderiert von: matph

[Zur Forum-Gliederung] [Wie man Fragen beantwortet] [Themenstart einblenden]

  Alle registrierten Mitglieder können Mitteilungen schreiben.
Benutzername:
Passwort:
Nachricht-Icon:                   
                  
              
Nachricht:


 
 


Input assistance tools (JavaScript): [Link extern intern] [MathML?] [$$?]
[fed-area] [LaTeX-inline] [LaTeX-display] [Tikz] [hide-area][show-area] [Source code [num.]][?]
 Show Preview      Write using fedgeo formula editor or Latex.

Smilies for your message:
😃 😄 😁 🙂 🙃 😉 🤗 🤫 🤔 🙄 😴 🤒 😎 😮 😲 😂
🙁 😖 😒 😐 😡 👌 👍 👎 🤢 🤧 🥵 🥶 😵 🤯 😛 😷
Optionen: Deaktiviere HTML in dieser Nachricht
Deaktiviere MATHML in dieser Nachricht. Wenn Dein Text $-Zeichen enthält, die nicht LaTeX-Formeln begrenzen.
Deaktiviere Smilies in dieser Nachricht
Zeige die Signatur (Kann in 'Mein Profil' editiert werden.)
    [Abbrechen]
 
Beachte bitte die [Forumregeln]


Themenübersicht
Scynja
Aktiv
Dabei seit: 23.02.2011
Mitteilungen: 394
Wohnort: Deutschland

 Beitrag No.6, eingetragen 2021-04-12 22:29    [Diesen Beitrag zitieren]

Man kann es auch mit Regexen machen...
Java
import java.util.regex.MatchResult;
import java.util.regex.Pattern;
 
public class WordsHavingSameLength {
    public static void main(String[] args) {
        printWords("Heute wird unser Algorithmus getestet wir werden sehen ob er funktioniert", 5);
    }
 
    public static void printWords(String stringToSearch, int i) {
        Pattern.compile("(?<![^\\s])([^\\s]{"+i+"})(?![^\\s])")
                .matcher(stringToSearch)
                .results()
                .map(MatchResult::group).forEach(w -> System.out.println(w));
    }
}

Bezüglich deiner Eingangsfrage: Es wäre hilfreich, wenn dein Code nicht rot ist, wenn man ihn in eine Entwicklungsumgebung kopiert. Wie soll die return-Methode etwas zurückgeben, wenn man den Code nicht kompilieren kann?


arhzz
Aktiv
Dabei seit: 18.10.2020
Mitteilungen: 118
 Beitrag No.5, eingetragen 2021-04-10 19:57    [Diesen Beitrag zitieren]

Ja,leider bin ich nicht so wirklich ein guter programier.Allerdings danke dir fur deine hilfe und ich kann dir gern mein Code zeigen(70-er vibe).
Java
import java.util.Arrays;
public class wordsOfLength {
 
	public static String[] splitString (String s) {
		return s.split (" ");
	}
 
	public static String wordsOfLength(String words,int length) {
		String foundWords = "";
		String[] split = splitString((words));
		for(int i=0; i <split.length; i++){
            if(split[i].length()== length){
                 foundWords += split[i] + ",";
            }
         }
		 return foundWords;
    }
 
    public static void main(String[] args) {
 
        System.out.print("Please input the text: ");  
        String words = In.readString();
		System.out.print("Please input the length:");
		int length = In.readInt();
        Out.println(wordsOfLength(words,length));
    }
}
 
 


DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2850
 Beitrag No.4, eingetragen 2021-04-09 08:40    [Diesen Beitrag zitieren]

Es geht selbstverständlich auch im C-Style ohne besondere Hilfsfunktionen.
Java
  1. /**
  2.   * Skip occurences of delim (probably whitespace)
  3.   * and return the index behind them.
  4.   * @param words The sequence to work on.
  5.   * @param idx The idx at which to start
  6.   * @param delim The delimiter to be skipped.
  7.   * @return Index behind delimiters.
  8.   */
  9. public static int skip(String words, int idx, char delim){
  10. // While not eof and char equals delim
  11. while (idx < words.length() && words.charAt(idx) == delim)
  12. ++idx; // increase idx
  13. return idx;
  14. }
  15.  
  16. /**
  17.   * Get the next word in a sequence.
  18.   * @param words The sequence to work on.
  19.   * @param idx The idx at which to start
  20.   * @param delim The delimiter at which to stop.
  21.   * @return The String between idx and next delimiter.
  22.   */
  23. public static String nextWord(String words, int idx, char delim){
  24. // Create an empty String to append to
  25. // While not eof and not char equals delim
  26. while (idx < words.length() && words.charAt(idx) != delim)
  27. next.append(words.charAt(idx++)); // append to String
  28. return next.toString();
  29. }
  30.  
  31. /**
  32.   * Get a "list" of Strings with given length.
  33.   * @param words The sequence to work on.
  34.   * @param length The length to search for.
  35.   * @return A String with the found words separated by ' '.
  36.   */
  37. public static String wordsOfLength(String words, int length){
  38. // Skip whitespace at front of "words"
  39. int idx = skip(words, 0, ' ');
  40. // Create an empty pseudo-list to store the words
  41. // while not eof
  42. while (idx < words.length()){
  43. // Read next word
  44. String next = nextWord(words, idx, ' ');
  45. // If it fits ...
  46. if (next.length() == length){
  47. // append to list
  48. lst.append(next).append(' ');
  49. }
  50. // Find next word
  51. idx += next.length();
  52. idx = skip(words, idx, ' ');
  53. }
  54. return lst.toString();
  55. }

So ein Code sieht natürlich sehr nach 90er-Jahre aus.


arhzz
Aktiv
Dabei seit: 18.10.2020
Mitteilungen: 118
 Beitrag No.3, eingetragen 2021-04-08 21:16    [Diesen Beitrag zitieren]

Ja mit streams habe ich noch nie gearbeitet.Ich probiere eine andere variante aufzubauen.


DerEinfaeltige
Senior
Dabei seit: 11.02.2015
Mitteilungen: 2850
 Beitrag No.2, eingetragen 2021-04-08 19:46    [Diesen Beitrag zitieren]

Grundsätzlich ist es hilfreich, so ein Problem in Teilprobleme zu zerlegen.

1. Spalte den Satz in eine Liste oder ein Array von Wörtern auf.
2. Filtere alle Wörter passender Länge.



Eine funktionale Quick&Dirty-Variante könnte so aussehen:
Java
  1. import java.util.Arrays;
  2. import java.util.stream.Collectors;
  3. import java.util.stream.IntStream;
  4.  
  5. public class WordFilter {
  6.  
  7. public static String wordsOfLength(String words, int length){
  8. return Arrays.stream(words.split(" "))
  9. .filter(w->w.length()==length)
  10. .collect(Collectors.joining(" "));
  11. }
  12.  
  13. public static void main(String[] args){
  14. var list = "John likes to program in Java";
  15. IntStream.range(1, 8)
  16. .forEach(len -> System.out.println(len + " -> " + wordsOfLength(list, len)));
  17. }
  18.  
  19. }

Ausgabe:
1 ->
2 -> to in
3 ->
4 -> John Java
5 -> likes
6 ->
7 -> program


Sismet
Aktiv
Dabei seit: 22.03.2021
Mitteilungen: 100
Wohnort: Heidelberg

 Beitrag No.1, eingetragen 2021-04-08 19:06    [Diesen Beitrag zitieren]

Hey,
ich kenn mich mit der Java-Syntax nicht so gut aus, aber da liegt nicht das Hauptproblem, dennoch denke ich das cnt und foundWords irgendwo initialisiert werden müssen.

Die Funktion die du geschrieben hast macht aber auch mit richtiger Syntax nicht das Richtige.
In der ersten for-Schleife zählt cnt wie viele nicht space Zeichen in deiner Zeichenkette sind.
In deiner 2. Schleife versuchst du die i-te stelle deiner Eingabe in foundWords zuschreiben. Das geht in deinem Code aber nur wenn cnt==length ist, also wenn die Anzahl aller nicht Space-Zeichen gleich length ist. Das ist in deinen Versuchen vermutlich nie der Fall gewesen und das soll ja auch nicht der Sinn des Algorithmus sein.

Arbeite mit split() das erleichtert die Aufgabe deutlich.

Grüße
Sismet


arhzz
Aktiv
Dabei seit: 18.10.2020
Mitteilungen: 118
 Themenstart: 2021-04-08 18:21    [Diesen Beitrag zitieren]

Hallo!
Konstruieren Sie einen Algorithmus wordsOfLength(words,length) nach der  Der Algorithmus bekommt eine per Leerzeichen getrennte Liste von Wörtern und einen Integer als Eingabe in der Kommandozeile, und gibt alle Wörter der
spezifizierten Länge in der Kommandozeile aus. Die Reihenfolge der ausgegebenen Wörter ist
hierbei frei wählbar
Java
import java.util.Arrays;
public class test {
	public static String wordsOfLength(String words, int length) {
 
		for(int i = 0; i < words.length(); i++) {
			if(words.charAt(i) != ' ') {
				cnt++;
			}
		}
		for(int i = 0; i < words.length(); i++) {
			if(cnt == length) {
				foundWords += words.charAt(i);
			}
		}
		return foundWords;
	}
 
 
	public static void main(String[] args) {
		Out.print("Please input a text:");
		String words = In.readString();
		Out.print("Please input a length:"); 
		int length = In.readInt();
		Out.println(wordsOfLength(words,length));
	}
}
 
 

Also der problem ist das die return methode nicht richtig funktioniert.Es gibt den Leeren Array zuruck und ich will das es den neuen array den ihn mit den chars fulle zuruckgibt.Das wurde mir weiterhelfen weil ich sehen konnte wie der neue string aussieht.Was muss ich umandern so dass es mir den ausgefullten array zuruckgibt?



 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]