我已经获得了此代码的帮助,完全归功于创作者
我正在尝试创建一个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" : "")));
});
}
}
答案 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