0

これを取得して、テキスト ファイルにあるすべての単語を昇順で出力しようとしています。実行すると、昇順で出力されますが、単語が 1 回しか出力されません。単語が出現するたびに印刷したい(重複が必要)。何が間違っているのかわかりません。また、テキスト ファイルにある句読点ではなく単語のみを出力したいと考えています。「分割」を使用する必要があることはわかっていますが、適切に使用する方法がわかりません。以前に一度使用したことがありますが、ここで適用する方法を思い出せません。

これは私がこれまでに持っているコードです:

public class DisplayingWords {

public static void main(String[] args) throws 
        FileNotFoundException, IOException 
{
    Scanner ci = new Scanner(System.in);
    System.out.print("Please enter a text file to open: ");
    String filename = ci.next();
    System.out.println("");

    File file = new File(filename);
    BufferedReader br = new BufferedReader(new FileReader(file));

    StringBuilder sb = new StringBuilder();
    String str;
    while((str = br.readLine())!= null)

    {
/*
 * This is where i seem to be having my problems.
 * I have only ever used a split once before and can not 
 * remember how to properly use it. 
 * i am trying to get the print out to avoid printing out 
 * all the punctuation marks and have only the words
 */

      //  String[] str = str.split("[ \n\t\r.,;:!?(){}]");
        str.split("[ \n\t\r.,;:!?(){}]");
        sb.append(str);
        sb.append(" ");
        System.out.println(str);
    }

    ArrayList<String> text = new ArrayList<>();
    StringTokenizer st = new StringTokenizer(sb.toString().toLowerCase());
            while(st.hasMoreTokens()) 
            {
                String s = st.nextToken();
                text.add(s);
            }

            System.out.println("\n" + "Words Printed out in Ascending "
                                + "(alphabetical) order: " + "\n");

            HashSet<String> set = new HashSet<>(text);
            List<String> arrayList = new ArrayList<>(set);
            Collections.sort(arrayList);
            for (Object ob : arrayList)
                System.out.println("\t" + ob.toString());
    }
}
4

2 に答える 2

1

あなたの重複はおそらくここで取り除かれています

HashSet<String> set = new HashSet<>(text);

通常、 aには重複が含まれていないため、配列リストsetを並べ替えるだけですtext

Collections.sort(text);
for (Object ob : text)
    System.out.println("\t" + ob.toString());
于 2013-04-17T17:54:07.787 に答える
1

問題はここにあります:

HashSet<String> set = new HashSet<>(text);

Set重複を含みません。

代わりに次のコードを使用する必要があります。

    //HashSet<String> set = new HashSet<>(text);
    List<String> arrayList = new ArrayList<>(text);
    Collections.sort(arrayList);

また、分割方法については、次を使用することをお勧めします。

s.split("[\\s\\.,;:\\?!]+");

たとえば、次のコードを考えてみましょう。

String s = "Abcdef;Ad; country hahahahah?           ad! \n alsj;d;lajfa try.... wait, which wish work";
String sp[] = s.split("[\\s\\.,;:\\?!]+");
for (String sr : sp )
{
    System.out.println(sr);
}

その出力は次のとおりです。

Abcdef
Ad
country
hahahahah
ad
alsj
d
lajfa
try
wait
which
wish
work
于 2013-04-17T17:55:01.307 に答える