卡在HashMap Collection的实现上


Question:

要求用户输入字符串并使用地图集合来计算字母和数字的次数。如果遇到任何其他字符,请使用星号 * 显示在主机上。

例: 输入字符串:aaaabbbcccddd1112233^^^ 输出格式: *

(3),1(3),2(2),3(2),a(4),b(3),c(3),d(3)(注:字符(次数))输入其他字符时,我很难在控制台上显示星号。谁能给我一些提示?

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class Test5 {
public static void main(String[] args) {
//Scanner Input
Scanner sc = new Scanner(System.in);
System.out.println("Give me a String: ");
String line = sc.nextLine();
//String -> charArray
char[] array = line.toCharArray();
//create HashMap object
HashMap<Character,Integer> hm = new HashMap<>();

//Travese the array and put it in HashMap
for(Character c : array) {
if(!hm.containsKey(c)) {
if(c == 97) {
hm.put(c, 1);
}
} else  {
hm.put(c, hm.get(c) + 1);
} 
}
//get the key 
Set<Character> key = hm.keySet();
//print
for(Character ch: key) {
System.out.println(ch + "(" + hm.get(ch) + ")");
}

}
}

这是从Imus那里扯出的答案,在国际上有效。

国际化的工作原理是获取字符的"Unicode 类别"并检查它是字母还是十进制数字。

此代码适用于大多数现存语言,并将通过大多数组织的国际化标准。

public static void main(String[] args) {
String inputString = "Non-naïve code handles ß 1234";
Map<Character, Integer> map = new HashMap<>();
for (char c : inputString.toCharArray()) {
int type=Character.getType(c);
if (type!=Character.UPPERCASE_LETTER && 
type!=Character.LOWERCASE_LETTER &&
type!=Character.DECIMAL_DIGIT_NUMBER
) {
c = '*';
}
map.put(c, map.getOrDefault(c, 0) + 1);
}
for (Character ch : map.keySet()) {
System.out.println(ch + "(" + map.get(ch) + ")");
}
}

另一种检查某物是否是字母的方法是Character.isLetter(c)但可能包括您不认为是字母的内容,这些字母可能是也可能不是(通常不是)问题。

我发布这个是因为Java的一个重要功能是它具有对Unicode的本机支持,但太多程序员不理解它。 我在所谓的国际组织中看到过太多的代码,这些代码无法处理ASCII以外的任何内容。无法接受客户的名字是赫尔穆特·马斯(Helmut Maaß)是很不礼貌的。

Java只为Unicode Basic Multilingual Plane提供了很好的支持。虽然如前所述,它支持大多数现存的语言!

如果你想完全使用Unicode,你可以得到它下面的嘶嘶声。 它必须在"代码点"中工作,因为某些Unicode"字符"不能由单个Java字符表示。

public static void main(String[] args) {
int MYSTERY=28;//Hmmmm....
String inputString = "ud83dude00ud83dude0eud83dude0fud83dude4cud83dude40";
Map<Integer, Integer> map = new HashMap<>();//Not from Character. We need an integer to store code-points.
for (int i=0;i<inputString.length();) {
int cp=inputString.codePointAt(i);//May read 2 characters to identify a code-point in a supplementary plane.
int type=Character.getType(cp);//Works fine. Overloaded to handle code-points.
int c;//We need to remember the original code-point for later...
if (type!=Character.UPPERCASE_LETTER && 
type!=Character.LOWERCASE_LETTER &&
type!=Character.DECIMAL_DIGIT_NUMBER &&
type!=MYSTERY //Whaaat???
) {
System.out.println(type);
c = '*';
}else{
c=cp;
}
map.put(c, map.getOrDefault(c, 0) + 1);
i+=Character.charCount(cp);//If we used 2 characters move on 2 or otherwise 1.
}
for (HashMap.Entry<Integer,Integer> curr : map.entrySet()) {
System.out.print(Character.toChars(curr.getKey()));//Gets us back to characters from code-points...
System.out.print("(" + curr.getValue() + ")");
}
}

我建议这对家庭作业来说太过分了。 这里发生的事情是,Unicode 的基本多语言平面之外的字符必须表示为 32 位整数,而不是 Java 的 16 位本机字符。

private static boolean isLetterOrDigit(char c) {
return (c >= 'a' && c <= 'z') ||
(c >= 'A' && c <= 'Z') ||
(c >= '0' && c <= '9');
}
public static void main(String[] args) {
String inputString = "blabla!!123";
Map<Character, Integer> map = new HashMap<>();
for (char c : inputString.toCharArray()) {
if (!isLetterOrDigit(c)) {
c = '*';
}
map.put(c, map.getOrDefault(c, 0) + 1);
}
for (Character ch : map.keySet()) {
System.out.println(ch + "(" + map.get(ch) + ")");
}
}

简单的奖励:如果您将哈希图替换为树状图,您的输出也会被排序。

Map<Character, Integer> map = new TreeMap<>();
final String lowerLetters = "abcdefghijklmnopqrstuvwxyz";
final String upperLetters = lowerLetters.toUpperCase();
final String digits = "0123456789";
final String lettersDigits = lowerLetters + upperLetters + digits;
String line = sc.nextLine();
Map<Character,Integer> map = new HashMap<>();
for (char c : line.toCharArray()) {
if (lettersDigits.indexOf(c) == -1) {
c = '*';
}
Integer count = map.get(c);
if (count == null) {
count = 0;
}
map.put(c,++count);
}
for(Entry<Character,Integer> e : map.entrySet()) {
System.out.println(e.getKey() + "(" + e.getValue() + ")");
}

最新更新