从Java中的文本文件读入的升序排序字母

时间:2016-04-19 22:07:45

标签: java string

我已经获得了此代码的帮助,完全归功于创作者

我正在尝试创建一个Java类,显示一个字母在文本文件中出现的次数,并按升序显示,因此如果文本文件包含Hello World,则输出将为

D is shown 1 time
E is shown 1 time
H is shown 1 time
L is shown 3 times
O is shown 2 times
R is shown 1 time
W is shown 1 time

然而,使用我所拥有的代码,它会显示字母及显示的次数,但不会像上面所示那样将它们组合在一起,而是显示为:

E is shown 1 time
H is shown 1 time
L is shown 2 times
O is shown 1 time
W is shown 1 time
L is shown 1 time
O is shown 1 time
R is shown 1 time
D is shown 1 time

我想要修改的代码(在开头所说的不是我的代码),以便它的输出类似于第一个例子

public class class1{

    public static void main(String[] args) throws IOException {
        try (Scanner in = new Scanner(new FileReader("example.txt"))) {
        while (in.hasNext()) {
                letterFrequency(in.next());
            }
        }
    }

    private static void letterFrequency(String input) {
        Map<Character, Integer> counts = new HashMap<>();
        for (char each : input.toCharArray()) {
            if (Character.isLetter(each)) {
                char upper = Character.toUpperCase(each);
                counts.put(upper, counts.getOrDefault(upper, 0) + 1);
            }
        }
        counts.entrySet().stream().forEach((entry) -> {
            System.out.println(String.format(String.format("%s is shown %d "
                + "time%s", entry.getKey(), entry.getValue(),
                entry.getValue() > 1 ? "s" : "")));
        });
    }
}

4 个答案:

答案 0 :(得分:2)

您的问题是您正在处理一次一个字

您的计数算法正常(输出顺序除外)。您的问题出在Scanner上,它一次读取一个单词。

更改扫描仪以读取整个文件,并将其传递给您的计数方法。一种(鬼鬼祟祟)的方式是这样做:

TreeMap<String, Integer> counts = new TreeMap<String, Integer>();

它将分隔符设置为所有输入的开头,当然也不会(再次)发生,因此它会一直读到流的末尾。

使用Scanner in = new Scanner(new FileReader("example.txt")).useDelimiter("\\A") 作为分隔符的一个有趣且方便的结果是,如果输入为空,"\\A"hasNext(),那么此更改也将自动干净地处理空文件。 / p>

您只需使用false代替TreeMap即可修正字母输出的顺序。

答案 1 :(得分:1)

您需要获取所有字符集,将其转换为数组,对所述数组进行排序,然后按顺序浏览值。有点像:

Character[] keys = counts.keySet().toArray();
java.util.Arrays.sort(keys)
for(Character key : keys) {
    // Do something with key and counts.get(key) for character and frequency respectively.
}

关于一次读取单词与整个文件有关的问题:

你应该将你的功能分为两部分,即计算内容的部分和显示内容的部分。像这样:

private static Map<Character, Integer> counts = new HashMap<>();
private static void countLetterFrequency(String input) {
    for (char each : input.toCharArray()) {
        if (Character.isLetter(each)) {
            char upper = Character.toUpperCase(each);
            counts.put(upper, counts.getOrDefault(upper, 0) + 1);
        }
    }
}
private static void displayLetterFrequency() {
    Character[] keys = counts.keySet().toArray();
    java.util.Arrays.sort(keys)
    for(Character key : keys) {
        System.out.println(String.format(String.format("%s is shown %d "
            + "time%s", key, counts.get(key),
            counts.get(key) > 1 ? "s" : "")));
    }
}

答案 2 :(得分:0)

问题在于您可以一次访问整个文件的空间,或者如下所示再次传递地图:

public static void main(String[] args) throws IOException {
    Map<Character, Integer> counts = new HashMap<>();
    try (Scanner in = new Scanner(new FileReader("example.txt"))) {
    while (in.hasNext()) {
            letterFrequency(in.next(), counts);
        }
    }

    counts.entrySet().stream().forEach((entry) -> {
        System.out.println(String.format(String.format("%s is shown %d "
            + "time%s", entry.getKey(), entry.getValue(),
            entry.getValue() > 1 ? "s" : "")));
    });
}

private static Map<Character, Integer> letterFrequency(String input, Map<Character, Integer> counts) {
    for (char each : input.toCharArray()) {
        if (Character.isLetter(each)) {
            char upper = Character.toUpperCase(each);
            counts.put(upper, counts.getOrDefault(upper, 0) + 1);
        }
    }
    return counts;
}

答案 3 :(得分:-1)

您可以使用var olt = Ti.UI.create3DMatrix(), curX, curY; imgView.addEventListener('touchstart', function(e) { curX = e.x; curY = e.y; }); imgView.addEventListener('touchmove', function(e) { var deltaX = e.x - curX; var deltaY = e.y - curY; olt = olt.translate(deltaX, deltaY, 0); imgView.animate({transform:olt, duration:100}); //-- top/left position of the imgView ? });

按键获取排序列表
TreeMap