1

Myには、 (およびで終わる)でString words区切られた単語の束が含まれています。コードは、単語がまだ存在しない場合にのみ、文字列に単語を追加します。これらのコードブロックはループ内にあり、追加する単語です。\n\nforw

私は持っています

loop: if (w.contains("" + letter)) //This is just to test the words I want to add
{
  for (String s : words.split("\n"))
    if (w.equals(s))
      break loop;
  words += w + "\n";
}

if (w.contains("" + letter))
{
  if (!words.contains("\n"+w+"\n") && words.indexOf(w+"\n") != 0)
    words += w + "\n";
}

しかし、どちらも独自の方法で厄介に見えます。これを回避する別の方法はありますか、またはどの方法がより迅速に実行されますか?

4

9 に答える 9

3

まずif、ループではありません。したがって、ラベル付きブレークを使用するようにラベルを付けても意味がありません。

第二に、あなたのコードは両方とも、あなたがやりたいと言ったことを実際には行っていません。if (w.equals(s))また、なぜこのテストを行っているのかわかりません。そして何wのために使われるのか。

あなたは言っw being the word to addた: つまり、1 つの単語だけでなく、多くの単語を追加しています。投稿を読み直して、必要に応じて編集してください。"\n"array


あなたの現在の問題の声明によると、私は次のようにアプローチします: -

  • 最初に行を分割して"\n"、個々の単語の配列を取得します。
  • 各反復で文字列を変更したい場合は、 StringBuilderorを使用したいと思います。StringBuffer
  • ここで、反復ごとに、StringBuilder既に含まれているかどうかを確認しますword。含まれていない場合は追加し、そうでない場合はそのままにします。
  • ループの最後で、StringBuilderインスタンスを印刷します。

または、あなたが言っているように、を使用しArrayListて単語を保存することもできます。または、unique単語のみが必要な場合は、Set代わりに a を使用する必要があります。その場合、テストを行う必要はありません。重複を独自に処理します。 -

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

Set<String> set = new LinkedHashSet<String>();

for (String s : words.split("\n")) {

    if (s.contains("" + letter)) {

        if (!wordList.contains(s)) {
            wordList.add(s);   // Add to list. 
        }
        set.add(s);   // Add to set.
    }
}

そして、 orのいずれかを繰り返し処理してArrayListorを出力します。Set

于 2012-11-21T08:54:51.760 に答える
1

リストを使用することをお勧めします

ArrayList<String> wordList = new ArrayList() ;
// to add
if (w.contains("" + letter) && wordList.contains(w) )
{
   wordList.add(w);
}
//at the end you can append \n
StringBuilder bdr = new StringBuilder() ;
for(String word : wordList)
{
     bdr.append(word).append("\n");
}
String words = bdr.toString();
于 2012-11-21T09:06:30.723 に答える
1

追加する個別の単語をリストに保存します。

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

void addWord(String word){
    if(!words.contains(word)){
        words.add(word);
    }
}

String listAsString(){
    StringBuilder buffer = new StringBuilder();
    for(String word: words){
        buffer.append(word);
        buffer.append("\n");
    }
    return buffer.toString();
}      
于 2012-11-21T09:02:19.483 に答える
0

単語を ArrayList に格納し、追加する前に ArrayList に単語が含まれているかどうかを確認するのはどうですか? 順序が重要でない場合は、セットを使用します。

コレクションを操作する方がはるかに簡単で、表示する必要があるときにコレクションを文字列に変換できます。例:

List wordList = new ArrayList();

public void addWord(String word){
    if(!wordList.contains(word)){
        wordList.add(word);
    }
}

public String displayWordsAsString(){
    StringBuilder builder = new StringBuilder();
    for(int i = 0; i < wordList.size(); i++){
        //add this condition if you only want a new line between words and not every time.
        if(i > 0)
            builder.append("\n");

        builder.append(word); 
    }

    return builder.toString();
}
于 2012-11-21T08:57:39.520 に答える
0

使用できます

Set<String> words = LinkedHashSet<String>();

if (words.add("" + letter)) {
    // Added.
}

単語を追加する順序を維持します。

于 2012-11-21T08:59:24.227 に答える
0

新しい単語が含まれているかどうかを確認し、区切り文字が \n である場合は、正規表現が必要になります。単独で含まれていることに依存しても、既存の単語のサブシーケンスで単語を追加することはできません。

public class AddWords {

    public String addWord(final String newWord, final String allWords) {
        String result = allWords;
        Pattern p = Pattern.compile(".*\n" + newWord + "\n.*");
        Matcher m = p.matcher(allWords);
        if (!m.find()) {
            StringBuffer buf = new StringBuffer();
            buf.append(allWords);
            buf.append(newWord);
            buf.append("\n");
            result = buf.toString();
        }
        return result;
    }
}

問題をよりよく理解するために、そのシナリオの単体テストを追加しました。

public class AddWordsTest {
    @Test
    public void addExistingWord() {
        String allWords = "\nfoo\nbar\n";
        String notNewWord = "foo";
        AddWords aw = new AddWords();
        String newAllWords = aw.addWord(notNewWord, allWords);
        Assert.assertEquals(allWords, newAllWords);
    }

    @Test
    //This would fail if you rely on contains!!!
    public void addNewWord() {
        String allWords = "\nfoobar\nbar\n";
        String newWord = "foo";
        AddWords aw = new AddWords();
        String newAllWords = aw.addWord(newWord, allWords);
        String expectedAllWords = "\nfoobar\nbar\nfoo\n";
        Assert.assertEquals(expectedAllWords, newAllWords);
    }
}
于 2012-11-21T09:40:31.287 に答える