0

これらの条件を考慮して、異なる行に文字列を返そうとしています。Java では文字列に += を使用できないため、行ごとに間隔を空けて「スタック」する 1 つの巨大な文字列を作成するにはどうすればよいですか? つまり、ループ内の新しい文字列を古い文字列に追加するにはどうすればよいでしょうか?

/**
   Returns a String that concatenates all "offending"
   words from text that contain letter; the words are
   separated by '\n' characters; the returned string
   does not contain duplicate words: each word occurs
   only once; there are no punctuation or whitespace
   characters in the returned string.

   @param letter character to find in text
   @return String containing all words with letter
 */
public String allWordsWith(char letter)
{
    String result = "";

    int i = 0;
    while (i < text.length())
    {
        char newchar = text.charAt(i);
        if (newchar == letter)
        {
            int index1 = text.lastIndexOf("",i);
            int index2 = text.indexOf("",i);
            String newstring = '\n' + text.substring(index2,index1);
        }
        i++;
    }
    return result;
}
4

5 に答える 5

1

毎回ループで文字列を再初期化しています。文字列宣言を eof ループの外に移動します。

これを交換

        String newstring = '\n' + text.substring(index2,index1);

        result = '\n' + text.substring(index2,index1);
于 2013-10-09T05:06:51.180 に答える
1

文字列を変更し、result「単語境界」テストを修正します。

if (newchar == letter) {
    int index1 = text.lastIndexOf(' ',i);
    int index2 = text.indexOf(' ',i);
    // TODO -- handle when index1 or index2 is < 0;  that means it wasn't found, 
    //  and you should use the string boundary (0 or length()) instead.
    String word = text.substring( index2,index1);
    result += "\n" + word;
}

パフォーマンスが本当に気になる場合は、StringBuilderandを使用できますが、それ以外の場合は、簡潔で読みやすいことappend()を強く好みます。+=

于 2013-10-09T05:10:10.983 に答える
0

まず、StringBuilder を使用します。

次に、 System.getProperty("line.separator") を使用して、適切な改行が使用されるようにします。

編集されたコード:

public String allWordsWith(char letter)
{
    StringBuilder sb = new StringBuilder();

    int i = 0;
    while (i < text.length())
    {
        char newchar = text.charAt(i);
        if (newchar == letter)
        {
            int index1 = text.lastIndexOf("",i);
            int index2 = text.indexOf("",i);
            sb.Append(text.substring(index2,index1));
            sb.Append(System.getProperty("line.separator"));
            //I put the new line after the word so you don't get an empty 
            //line on top, but you can do what you need/want to do in this case.
        }
        i++;
    }
    return result;
}
于 2013-10-09T05:16:58.683 に答える
0
String text = "I have android code with many different java, bmp and xml files everywhere in my project that I used during the drafting phase of my project.";
String letter = "a";
Set<String> duplicateWordsFilter = new HashSet<String>(Arrays.asList(text.split(" ")));
StringBuilder sb = new StringBuilder(text.length());
for (String word : duplicateWordsFilter) {
    if (word.contains(letter)) {
        sb.append(word);
        sb.append("\n");
    }
}
return sb.toString();

結果は次のとおりです。

android
have
java,
drafting
and
many
that
phase
于 2013-10-09T05:34:12.040 に答える