如何按特定订单长度顺序列出字符串项?

时间:2013-09-23 02:57:27

标签: java arraylist data-structures hashset

我希望我的程序一次读取一行输入,如果它不是某些先前输入行的副本,则将每行写入输出。此外,具有大量重复行的文件不会使用比唯一行数所需的内存更多的内存。

重复的行应该在输入中输出相同的次数我已经完成了问题的一半但仍然无法正常工作..

public class Part1 {




public static void doIt(BufferedReader r, PrintWriter w) throws IOException {
    Set<String> s = new HashSet<String>();
    String inpt;
    int n = 0;
    while ((inpt = r.readLine()) != null) {
        s.add(inpt);
        n++;
    }
    Iterator<String> i = s.iterator();
    while (i.hasNext()) {
        w.println(i.next());
    }

}


public static void main(String[] args) {
    try {
        BufferedReader r;
        PrintWriter w;
        if (args.length == 0) {
            r = new BufferedReader(new InputStreamReader(System.in));
            w = new PrintWriter(System.out);
        } else if (args.length == 1) {
            r = new BufferedReader(new FileReader(args[0]));
            w = new PrintWriter(System.out);                
        } else {
            r = new BufferedReader(new FileReader(args[0]));
            w = new PrintWriter(new FileWriter(args[1]));
        }
        long start = System.nanoTime();
        doIt(r, w);
        w.flush();
        long stop = System.nanoTime();
        System.out.println("Execution time: " + 10e-9 * (stop-start));
    } catch (IOException e) {
        System.err.println(e);
        System.exit(-1);
    }
}
}

}

1 个答案:

答案 0 :(得分:0)

您使用Set的设计决定很好,但它无法帮助您计算事件。你需要的是地图。令人高兴的是,Map的键是Set。

没有勺子给你答案:

  • 使用Map<String, Integer>存储字词及其出现次数
  • 选择LinkedHashMap作为地图实施以保留订单
  • 使用Map.contains()确定是否需要创建新条目
  • 使用自动装箱/拆箱进行算术
  • 输出时,使用Map.entrySet()个对象的foreach循环遍历Map.Entry<String, Integer>

你应该能够用几行代码完成整个事情。