1

私は2つ持っていArrayList<String>ます。1 つは句読点と大文字を含む単語を含み、もう 1 つはこれらが削除されています。

リスト1:

File word: it's
File word: Sit
File word: yes-man
File word: murdered
File word: ok
File word: DereDrum
File word: Hello
File word: Friend

リスト 2:

Edited word: its
Edited word: sit
Edited word: yesman
Edited word: murdered
Edited word: ok
Edited word: deredrum
Edited word: hello
Edited word: friend

アイデアは、どの単語が互いにアナグラムであるかをチェックして確認することでした. もしそうなら、私がやりたいのはそれらを再版することだけですが、互いに同じ行にアナグラムである単語を入れてください:

it's Sit

yes-man

murdered DereDrum

ok

hello

friend

私はこれを次のようにしようとしました:

        for (int i = 0; i < words.size(); i++)
        {
            System.out.print(words.get(i));
            for (int j = i+1; j < grams.size(); j++)
            {
                anagramChecker(grams.get(i),"",grams.get(j),words.get(j));
            }
            System.out.println();
        }

私が念頭に置いていた方法は、この for ループが List1(words) のサイズの間持続し、それが見ている単語を出力することでした。次に、anagramChecker を使用します。

public static void anagramChecker(String s1,String s2,String checked,String word)
{
    if(s1.length() == 0)
    {
        if(s2.equals(checked))
        {
            System.out.println(" " + word);
            return;
        }
    }
    for(int i = 0 ; i < s1.length() ; i++)
    {
        anagramChecker(s1.substring(0, i) + s1.substring(i+1, s1.length()),s2 + s1.charAt(i),checked,word);
    }
}

この方法は機能せず、出力は次のようになりました。

it's
Sit yes-man
 yes-man
 yes-man
 yes-man
 yes-man
 yes-man
 yes-man
 yes-man

yes-man
murdered
ok
DereDrum Hello

Hello
Friend

2番目のリストで単語自体がアルファベット順にソートされた後、単語をアルファベット順にソートできるように、マップを使用してみました。それはほぼ同じ出力を持っていました。

4

3 に答える 3

2

hereのアナグラム ロジックを再利用します。

public boolean areAnagrams(String s1, String s2) {
    //TODO : Strip punctuations from s1 and s2
    char[] ch1 = s1.toCharArray();
    char[] ch2 = s2.toCharArray();
    Arrays.sort(ch1);
    Arrays.sort(ch2);
    return Arrays.equals(ch1,ch2);
}

両方のリストを反復処理し、areAnagramstrue を確認してから出力します。

for (int i=0;i<size;i++) {  
    String first = firstList.get(i);
    String second = secondList.get(i);
    if (areAnagrams (first, second) {
        System.out.println(first + " " + second);
    }    
}
于 2013-03-14T04:54:19.723 に答える
2

以下のコードを試してください。

import java.util.ArrayList;
import java.util.List;

public class Client {

    public static void main(String[] args) {

        List<String> lst1 = new ArrayList<String>();
        List<String> lst2 = new ArrayList<String>();

        lst1.add("it's");
        lst1.add("Sit");
        lst1.add("yes-man");
        lst1.add("murdered");
        lst1.add("ok");
        lst1.add("DereDrum");
        lst1.add("Hello");
        lst1.add("Friend");

        lst2.add("its");
        lst2.add("sit");
        lst2.add("yesman");
        lst2.add("murdered");
        lst2.add("ok");
        lst2.add("deredrum");
        lst2.add("hello");
        lst2.add("friend");

        for (int i = 0; i < lst2.size(); i++) {
            String original = lst2.get(i);
            StringBuffer buff = new StringBuffer(original);
            buff.reverse();
            if (lst2.contains(buff.toString())) {
                System.out.println(lst1.get(i) + " "
                        + lst1.get(lst2.indexOf(buff.toString())));
                lst1.remove(lst2.indexOf(buff.toString()));
                lst2.remove(buff.toString());
            } else {
                System.out.println(lst1.get(i));
            }

        }

    }

}

そして、出力は次のようになります。

it's
Sit
yes-man
murdered DereDrum
ok
Hello
Friend

以下のリンクをクリックすると、オンラインで実行および確認できます。

Java オンライン実行フィドルの例

于 2013-03-14T05:38:53.270 に答える
1

もう一度やり直してください...そして、他の誰かがすでにあなたに重要なポイントを教えてくれました. それをchar配列に入れて、ソートして、比較して、完了です。

package array;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

public class Anagrams {

    private static ArrayList<Character> convert(String txt) {
    ArrayList<Character> alph = new ArrayList<Character>();
    for (int i = 0; i < txt.length(); i++)
        if (Character.isLetter(txt.charAt(i)))
        alph.add(Character.toLowerCase(txt.charAt(i)));
    Collections.sort(alph);
    return alph;
    }

    public static void main(String[] args) {
    ArrayList<String> first = new ArrayList<String>();
    first.add("it's");
    first.add("Sit");
    first.add("yes-man");
    first.add("murdered");
    first.add("ok");
    first.add("DereDrum");
    first.add("Hello");
    first.add("Friend");

    ArrayList<String> second = new ArrayList<String>();
    second.add("its");
    second.add("sit");
    second.add("yesman");
    second.add("murdered");
    second.add("ok");
    second.add("deredrum");
    second.add("hello");
    second.add("friend");

    ArrayList<Integer> checked = new ArrayList<Integer>();

    for (int i = 0; i < first.size(); i++) {
        String line = "";
        if (!checked.contains(i))
        line += first.get(i) + " ";

        ArrayList<Character> firstChrAry = convert(first.get(i));

        for (int j = i + 1; j < second.size(); j++) {
        ArrayList<Character> secondChrAry = convert(second.get(j));
        if (firstChrAry.size() == secondChrAry.size()) {
            if (firstChrAry.equals(secondChrAry)) {
            line += first.get(j);
            checked.add(j);
            }
        }
        }
        if (!line.equals(""))
        System.out.println(line);
    }

    }
}

出力結果をここに追加します。

シットです

はい男

殺したデレドラム

わかった

こんにちは

友達

于 2013-03-14T05:18:24.923 に答える