9

Java を使用して、テキスト ドキュメントから一意の単語の数をカウントする必要があります。まず、すべての単語の句読点を取り除く必要がありました。Scannerこのクラスを使用してドキュメント内の各単語をスキャンし、 String に入れましたArrayList

だから、次のステップは私が問題を抱えているところです! 配列内の一意の文字列の数をカウントできるメソッドを作成するにはどうすればよいですか?

たとえば、配列に apple、bob、apple、jim、bob が含まれているとします。この配列の一意の値の数は 3 です。


public countWords() {
    try {
        Scanner scan = new Scanner(in);
        while (scan.hasNext()) {
            String words = scan.next();
            if (words.contains(".")) {
                words.replace(".", "");
            }
            if (words.contains("!")) {
                words.replace("!", "");
            }
            if (words.contains(":")) {
                words.replace(":", "");
            }
            if (words.contains(",")) {
                words.replace(",", "");
            }
            if (words.contains("'")) {
                words.replace("?", "");
            }
            if (words.contains("-")) {
                words.replace("-", "");
            }
            if (words.contains("‘")) {
                words.replace("‘", "");
            }
            wordStore.add(words.toLowerCase());
        }
    } catch (FileNotFoundException e) {
        System.out.println("File Not Found");
    }
    System.out.println("The total number of words is: " + wordStore.size());
}
4

9 に答える 9

24

セットを使用してもよろしいですか?もしそうなら、あなたのHashSetがあなたの問題を解決するかもしれません。HashSet重複は認めません。

HashSet noDupSet = new HashSet();
noDupSet.add(yourString);
noDupSet.size();

size()メソッドは、一意の単語の数を返します。

本当にArrayListのみを使用する必要がある場合、達成する1つの方法は、

1) Create a temp ArrayList
2) Iterate original list and retrieve element
3) If tempArrayList doesn't contain element, add element to tempArrayList
于 2012-10-04T03:50:11.003 に答える
3

HashSetを使用することをお勧めします。これにより、メソッドを呼び出すときに重複が自動的にフィルタリングされaddます。

于 2012-10-04T03:58:53.660 に答える
2

セットが最も簡単な解決策だと思いますが、元の解決策を引き続き使用し、if ステートメントを追加して、追加を行う前にリストに値が既に存在するかどうかを確認することができます。

if( !wordstore.contains( words.toLowerCase() )
   wordStore.add(words.toLowerCase());

次に、リスト内の単語の数は、一意の単語の総数です (つまり、 wordStore.size() )

于 2012-10-04T04:06:23.273 に答える
0
public class UniqueinArrayList {

    public static void main(String[] args) { 
        StringBuffer sb=new StringBuffer();
        List al=new ArrayList();
        al.add("Stack");
        al.add("Stack");
        al.add("over");
        al.add("over");
        al.add("flow");
        al.add("flow");
        System.out.println(al);
        Set s=new LinkedHashSet(al);
        System.out.println(s);
        Iterator itr=s.iterator();
        while(itr.hasNext()){
            sb.append(itr.next()+" ");
        }
        System.out.println(sb.toString().trim());
    }

}
于 2013-02-08T22:16:51.607 に答える
0

簡単に言えば、次のようにすることができます...

    ArrayList<String> duplicateList = new ArrayList<String>();
    duplicateList.add("one");
    duplicateList.add("two");
    duplicateList.add("one");
    duplicateList.add("three");

    System.out.println(duplicateList); // prints [one, two, one, three]

    HashSet<String> uniqueSet = new HashSet<String>();

    uniqueSet.addAll(duplicateList);
    System.out.println(uniqueSet); // prints [two, one, three]

    duplicateList.clear();
    System.out.println(duplicateList);// prints []


    duplicateList.addAll(uniqueSet);
    System.out.println(duplicateList);// prints [two, one, three]
于 2012-10-04T04:06:11.387 に答える
0

HashTable または HashMap も作成できます。キーは入力文字列になり、値は入力配列で文字列が出現する回数になります。O(N) の時間と空間。

解決策 2:

入力リストをソートします。同様の文字列が隣り合っています。list(i) と list(i+1) を比較し、重複の数を数えます。

于 2012-10-04T03:51:25.070 に答える
0

3 つの異なる可能な解決策:

  1. 上記の提案に従って HashSet を使用します。

  2. 以下のような一時的ArrayListな要素を作成し、一意の要素のみを保存します。

    public static int getUniqueElement(List<String> data) {
        List<String> newList = new ArrayList<>();
        for (String eachWord : data)
        if (!newList.contains(eachWord))
            newList.add(eachWord);
        return newList.size();
    }
    
  3. Java 8 ソリューション

    long count = data.stream().distinct().count();
    
于 2017-05-28T12:04:51.663 に答える