文件读/写有多个排序

时间:2014-11-07 03:03:09

标签: java file java.util.scanner alphabetical

我有一个我从中读取的文本文件,其中包含已按字母顺序排列的名称列表。我想阅读每个名字,并按照我创建的新文件中名称的长度按字母顺序排列。

我从原始文件中读取并将名称放在新创建的文件中似乎没有任何问题。

但是,我需要:

  • 按字母顺序列出的所有名称长度为1
  • 然后是长度为2的名字
  • 然后3,依此类推。

我现在拥有的代码获取了我想要的长度的所有正确名称,但它将所有名称按照它们在正在读取的文件中的显示顺序排列。我的问题是:如何列出长度为1的所有名称,然后按顺序列出所有长度为2的等等?

我也不能使用任何与数组有关的东西。

This is what I get in the newly created file from the code i have.

A
Al
B
Bo
C
D
E
Ed
F
G
H
I
J
Jo
K
L
Lu
M
N
O
P
R
S
T
Ty
V
W
Wm

import java.io.*;
import java.util.*;
public class Lab11 {
   public static Scanner input = new Scanner (System.in);
   public static void main (String[] args) throws FileNotFoundException {
      Scanner fileInput = new Scanner(new File("names.txt"));
      PrintStream fileOut = new PrintStream(new File("results.txt"));
      int count1 = 0;
      int count2 = 0;
      int sum = 0;
      while (fileInput.hasNext()) {
         String name = fileInput.next();
         count1++;
         if (name.length() == 1) {
            count2++;
            fileOut.println(name);
         }
         if (name.length() == 2) {
            fileOut.println(name);
         }
         while (fileInput.hasNextInt()) {
            sum += fileInput.nextInt();
         }
      }
      System.out.println(count1);
      System.out.println(count2);
   }
}

2 个答案:

答案 0 :(得分:0)

我首先要实现一个自定义Comparator<String>,在比较String值之前比较长度(实际上,处理null也是个好主意),例如< / p>

static class StringLengthComp implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        if (o1 == null) {
            if (o2 != null) {
                return -1;
            }
            return 0;
        } else if (o2 == null) {
            return 1;
        }
        int r = Integer.valueOf(o1.length()).compareTo(o2.length());
        if (r != 0) {
            return r;
        }
        return o1.compareTo(o2);
    }
}

然后,您可以将值存储在List<String>中并使用Collections.sort(List, Comparator),然后在执行后打印到文件。另外,我建议您使用try-with-resources之类的

public static void main(String[] args) {
    try (Scanner fileInput = new Scanner(new File("names.txt"));
            PrintStream fileOut = new PrintStream(new File("results.txt"));) {
        int sum = 0;
        List<String> names = new ArrayList<>();

        while (fileInput.hasNext()) {
            String name = fileInput.next();
            names.add(name);
            while (fileInput.hasNextInt()) {
                sum += fileInput.nextInt();
            }
        }
        Collections.sort(names, new StringLengthComp());
        for (String name : names) {
            fileOut.println(name);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
}

答案 1 :(得分:0)

为了按字母顺序打印出来,你需要在数据结构中保存所有名称(如果你知道你将拥有多少名字,请使用数组;如果你不知道知道你将拥有多少名字,使用数组列表。

一旦你拥有容器中的所有文件,你将不得不再次运行它们来对它们进行排序(有很多方法可以做到这一点 - 冒泡排序是最简单的。其他可能合适的包括选择排序快速排序)。

最后,一旦它们全部排序,执行循环遍历列表x次,其中x是列表中最长字符串中最长的字符数。每次浏览列表时,都要打印出一定长度的字符。