我知道此主题已经涵盖过,但我找不到我需要的东西。我试图计算字母表中每个字母的出现次数;来自用户输入的字符串。输出将包括所有26个字母,即使它们没有出现。因此,将为未发生的字母分配0。我通过循环遍历字母数组并将其与用户输入进行比较来实现此目的。
我在添加字母和显示每个字母时遇到问题。我的输出导致显示每个字母inputed + 1.
.
输出
public class TwoArrays {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
char[] lower = new char[] {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
char[] upper = new char[] {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
System.out.println("Please enter a sentence to parse.");
String userString = input.nextLine();
for(int i = 0; i < userString.length(); i++) {
//lowercase
for(int l = 0; l < lower.length; l++) {
int counter = 0;
if(lower[l] == userString.charAt(i)) {
counter++;
System.out.println(lower[l] + ":" + counter);
}
}
//uppercase
for(int u = 0; u < upper.length; u++) {
int counter = 0;
if(upper[u] == userString.charAt(i)) {
counter++;
System.out.println(upper[u] + ":" + counter);
}
}
}
}
}
答案 0 :(得分:1)
使用增强型循环+ HashMap
,您可以统一包含两个char的数组:
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
char[] array = new char[] {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
System.out.println("Please enter a sentence to parse.");
String userString = input.nextLine();
HashMap<Character, Integer> charint = new HashMap<>();
for (Character c : userString.toCharArray()){
if (charint.containsKey(c)) charint.replace(c, charint.get(c).intValue() + 1);
else charint.put(c, 1);
}
for (int i = 0 ; i < array.length ; i++){
System.out.println(array[i] + " : " + (charint.get(array[i]) == null ? "0" : charint.get(array[i])));
}
}
<强>输出强>
Please enter a sentence to parse.
Hello the world
a : 0
b : 0
c : 0
d : 1
e : 2
f : 0
g : 0
h : 1
i : 0
j : 0
k : 0
l : 3
m : 0
n : 0
o : 2
p : 0
q : 0
r : 1
s : 0
t : 1
u : 0
v : 0
w : 1
x : 0
y : 0
z : 0
A : 0
B : 0
C : 0
D : 0
E : 0
F : 0
G : 0
H : 1
I : 0
J : 0
K : 0
L : 0
M : 0
N : 0
O : 0
P : 0
Q : 0
R : 0
S : 0
T : 0
U : 0
V : 0
W : 0
X : 0
Y : 0
Z : 0
答案 1 :(得分:0)
这是一个不区分大小写的英文字母计数应用程序版本:
public static void main(final String[] args) {
System.out.println("Please enter a sentence to parse.");
try (final Scanner input = new Scanner(System.in)) {
final String userString = input.nextLine();
final long[] symbols = new long[26];
for (final char c : userString.toCharArray()) {
if ((c >= 'a') && (c <= 'z')) {
symbols[c - 'a']++;
} else if ((c >= 'A') && (c <= 'Z')) {
symbols[c - 'A']++;
}
}
for (int i = 0; i < 26; i++) {
System.out.println((char) ('a' + i) + ": " + symbols[i]);
}
}
}
“hello WORLD”的示例输出:
a: 0
b: 0
c: 0
d: 1
e: 1
f: 0
g: 0
h: 1
i: 0
j: 0
k: 0
l: 3
m: 0
n: 0
o: 2
p: 0
q: 0
r: 1
s: 0
t: 0
u: 0
v: 0
w: 1
x: 0
y: 0
z: 0
答案 2 :(得分:0)
以下是使用hashmap
的方法。由于您要将0
显示为不在字符串中的char
,我们可以put
map
中的所有字符value
。然后我们可以迭代字符串并增加找到的字符Map<Character, Integer> charMap = new HashMap<Character, Integer>();
for (Character c: "abcdefghijklmnopqrstuvwxyz".toCharArray()) {
charMap.put(c, 0);
}
for (Character c: test.toCharArray()) {
if (charMap.containsKey(c)) {
charMap.put(c, charMap.get(c) + 1);
}
}
。
{{1}}
答案 3 :(得分:0)
使用Google Guava的Multiset
,您可以摆脱不必要的样板并在单行中计算区分大小写的直方图(使用input.toLowerCase().toCharArray()
表示不区分大小写):
String input = "hello WORLD";
Multiset<Character> histogram = HashMultiset.create(
Chars.asList(input.toCharArray()));
直方图可以这样输出:
public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
//...
final List<Character> caseSensitiveAlphabet
= Lists.newArrayList(Chars.asList(ALPHABET.toCharArray()));
caseSensitiveAlphabet.addAll(
Chars.asList(ALPHABET.toUpperCase().toCharArray()));
for (char c : caseSensitiveAlphabet) {
System.out.println(c + " : " + histogram.count(c));
}
答案 4 :(得分:0)
// does not work...
context.getBeansOfType(Publisher<pubInfo.getClass()>.class);
认为这会对你有所帮助。
答案 5 :(得分:0)
在Java 8中,你可以解决这个问题:
String input = "Hello WORLD";
Map<Character, Integer> map = new TreeMap<>();
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
.chars()
.mapToObj(i -> (char) i)
.forEach(c -> map.put(c, 0));
input.chars()
.mapToObj(i -> (char) i)
.forEach(c -> map.computeIfPresent(c, (k, v) -> v + 1));
System.out.println(map);
这将产生:
{A = 0,B = 0,C = 0,D = 1,E = 0,F = 0,G = 0,H = 1,I = 0,J = 0,K = 0,L = 1,M = 0,N = 0,O = 1,P = 0,Q = 0,R = 1,S = 0,T = 0,U = 0,V = 0,W = 1,X = 0, Y = 0,Z = 0,a = 0,b = 0,c = 0,d = 0,e = 1,f = 0,g = 0,h = 0,i = 0,j = 0,k = 0,l = 2,m = 0,n = 0,o = 1,p = 0,q = 0,r = 0,s = 0,t = 0,u = 0,v = 0,w = 0, x = 0,y = 0,z = 0}
答案 6 :(得分:0)
这是最简单的答案,不使用任何包...
这里我有一个字符串,首先我将这个字符串转换为chararray然后我运行了一个循环来计算这个字符串中的字母数量。
因为每个字母至少出现一次,所以我已经将1分配给了一个标志c,用于存储每个字母的出现次数。
现在我运行嵌套循环以检查字母表是否出现多次..如果它确实发生,我将标志c递增1然后我从k = j运行第三个嵌套循环以删除这个重复的字母表...
这里j是重复字母表的索引并且删除该字母表我将下一个(j + 1)索引处的值分配给该(j)索引,并且索引j + 2处的值被分配给索引j + 1。 ...依此类推,直到我达到n-1指数,该指数现在被指定为第n个指数的值。
删除这个重复的字母后,chararray的大小减少1,所以我将n减1。
public class AlphabetOccurance {
public static void main(String[] args) {
String s;
s = "ASGFDTRRCJFYDCJHGJ";
char ch[] = s.toCharArray(); // converted string to chararray
int i,j,k,c=1,n;
for (i=0; i<s.length();i++); // loop to find no. of alphabet in string
n=i;
System.out.println("number of charaters in string = " + n);
for (i=0; i<n;i++)
{
for (j=i+1; j<n ;j++)
{
if (ch[j] == ch[i]) //if an alphabet if repeated...
{
c++; // if repeated alphabet found, increment count by 1
for (k=j; k<n-1;k++) //loop to delete repeated alphabet
{
ch[k] = ch[k+1];//deleting repeated alphabet
}
n--; // after deleting repeated alphabet, n is decremented by 1
}
}
System.out.println("alphabet " + ch[i] + " occured " + c + " times");
c=1; // for counting of next alphabet, now initialized c back to 1
}
}}
<强>输出:强>
string = 18
中的字符数字母A出现1次
字母S出现1次
字母G出现2次
字母F出现2次
字母D出现2次
字母T出现1次
字母表R出现2次
字母C出现2次
字母表J出现3次
字母Y出现1次
字母H发生1次