Question:
要求用户输入字符串并使用Map集合计算字母和数字的次数。如果遇到任何其他字符,请使用星号*在控制台上显示。
实施例: 输入字符串: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) + ")");
}
}
}
答案 0 :(得分:2)
这是一个从国际上有效的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之外的任何事情。无法接受顾客的名字是HelmutMaaß。
Java只对Unicode基本多语言平面提供了很好的支持。虽然如上所述支持大多数生活语言!
如果你想要使用完整的Unicode,你会得到以下的shizzle。 它必须在'代码点'中工作,因为一些Unicode“字符”不能用单个Java字符表示。
public static void main(String[] args) {
int MYSTERY=28;//Hmmmm....
String inputString = "\ud83d\ude00\ud83d\ude0e\ud83d\ude0f\ud83d\ude4c\ud83d\ude40";
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位本机字符。
答案 1 :(得分:1)
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) + ")");
}
}
轻松奖励:如果用TreeMap替换HashMap,您的输出也会被排序。
Map<Character, Integer> map = new TreeMap<>();
答案 2 :(得分:0)
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() + ")");
}