0

在 split 命令之后打印出来的单词不是按升序打印出来的。我认为我没有将它放置在代码的正确位置,但我不确定到底要放置它。它根据需要逐字打印整个文本段落,没有任何标点符号,但不会按升序(字母)顺序打印。任何帮助都会很棒。

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)
    {
        String sp[] = str.split("[\\s\\.,;:\\?!]+");
        for (String sr : sp )
        {
            System.out.println(sr);
        }            

        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");

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

1 回答 1

0

您要打印两次单词,一次是在标点符号上拆分文本之后,然后是在将其粘在一起后再次打印,再次拆分并最终对其进行排序。

但是,在行阅读中while,您正在拆分每一行,但是您随后忽略了该拆分的结果(除了打印它),并且您继续将原始行添加到sb.

您可能想sb变成一个ArrayList,然后将每个单词(sr从循环sp中)添加到并对其进行排序。for(sr : sp)sb

然后,您可以删除整个部分StringTokenizer并立即对其进行排序ArrayList。像这样:

ArrayList<String> sb = new ArrayList<String>();
String str;

while((str = br.readLine())!= null)
{
    String sp[] = str.split("[^\\w]+");
    for (String sr : sp )
    {
        sb.add(sr);
        // System.out.println(sr);
    }          
}
sb = Collections.sort(sb);
于 2013-04-17T22:16:24.547 回答