Java 字符串中的数字频率
我应该这样做: 对于输入数字,按出现顺序打印每个数字的频率。例如: 输入:56464 输出: 数字频率 5 -1 6 -2 4-2Java 字符串中的数字频率,java,string,Java,String,我应该这样做: 对于输入数字,按出现顺序打印每个数字的频率。例如: 输入:56464 输出: 数字频率 5 -1 6 -2 4-2 除了java.lang和Scanner之外,我不能使用任何其他库进行输入 所以我试了一下: package practice2; import java.util.Scanner; public class DigitFrequency2 { private static Scanner sc; public static void main
除了java.lang和Scanner之外,我不能使用任何其他库进行输入 所以我试了一下:
package practice2;
import java.util.Scanner;
public class DigitFrequency2
{
private static Scanner sc;
public static void main(String[] args)
{
sc = new Scanner(System.in);
System.out.println("Enter an integer number");
String sb = sc.nextLine();
System.out.println("Number\tFrequency");
int i,x,c = 0;
for(i=0;i<sb.length();i++)
{
c = 0;
for(x = i+1;x<sb.length();x++)
{
if(sb.charAt(i) == sb.charAt(x) && sb.charAt(i) != '*' && sb.charAt(x) != '*')
{
c++;
sb.replace(sb.charAt(x),'*');
}
}
if(c>0)
{
System.out.println(sb.charAt(i)+" \t"+c);
}
}
}
}
我哪里出错了,请帮助。这应该是一个很好的代码,可以使用用户输入打印频率:
public static void main(String args[])
{
System.out.println("Please enter numbers ");
String time = in.nextLine(); //USER INPUT
time = time.replace(":", "");
char digit[] = {time.charAt(0), time.charAt(1), time.charAt(2), time.charAt(3)};
int[] count = new int[digit.length];
Arrays.sort(digit);
for (int i = 0; i < digit.length; i++)
{
count[i]++;
if (i + 1 < digit.length)
{
if (digit[i] == digit[i + 1])
{
count[i]++;
i++;
}
}
}
for (int i = 0; i < digit.length; i++)
{
if (count[i] > 0)
{
System.out.println(digit[i] + " appears " + count[i]+" time(s)");
}
}
}
简单的方法就是这样。我不想费心评论,因为很清楚发生了什么
Scanner in = new Scanner(System.in);
while (true) {
System.out.print("Input String: ");
String line = in.nextLine();
while (!line.isEmpty()) {
char c = line.charAt(0);
int length = line.length();
line = line.replace(String.valueOf(c), "");
System.out.println(c + " " + (length - line.length()));
}
}
与某人的关系没有什么问题。替换某人的字符“*”;: 替换替换所有字符,而不仅仅是第一个字符,这就是为什么c不能大于1的原因。 字符串是不可变的,所以因为replace不能编辑原始字符串,所以它返回一个新字符串,其中包含替换的字符,您可以将其存储回sb引用中。 无论如何,如果您能够使用Java.lang.*或Java.util.Scanner之外的其他Java资源,那么简单的方法就是使用映射,它将映射字符的出现次数。这里非常有用的是Java8中添加的merge方法,它允许我们传递新旧值的组合键initialValue 因此,您的代码可以如下所示:
String sb = ...
Map<Character, Integer> map = new TreeMap<>();
for (char ch : sb.toCharArray()) {
map.merge(ch, 1, Integer::sum);
}
map.forEach((k, v) -> System.out.println(k + "\t" + v));
问题是,正如前面提到的,字符串是不可变的,所以String.replace只返回一个新字符串,而不能修改原始字符串。您应该使用StringBuilder,或者存储返回值,例如sb=sb.replacesb.charAtx,“*” 更进一步说,由于您使用0初始化c,因此如果没有其他出现问题的字符sb.charAti,它将保持为0,因此您的算法不会检测和打印只出现一次的数字,因为以后您只会在c>0时打印 计算字符串中字符或数字的出现频率是一个简单的操作,不需要创建新字符串,只需在字符上循环一次即可 这里有一个更高效的解决方案,也是最快的解决方案之一。由于数字在“0”…“9”范围内,您可以创建一个数组,在该数组中计算出现次数,并且只在字符上循环一次。不需要更换任何东西。在另一个顺序字符数组中记住出现的顺序
char[] order = new char[10];
int[] counts = new int[10];
for (int i = 0, j = 0; i < sb.length(); i++)
if (counts[sb.charAt(i) - '0']++ == 0)
order[j++] = sb.charAt(i); // First occurrence of the digit
示例输出:
Enter an integer number
56464
Number Frequency
5 1
6 2
4 2
为完整起见,以下是完整的主要方法:
嗯,sb.replace在代码中没有任何作用:字符串是不可变的。可能您想将字符串分配给StringBuilder?我不能使用StringBuilder:我在这里使用StringBuilder,我不能使用StringBuilder为什么?它是java.lang包的一部分。但是,除了java.lang和Scanner之外,我不能使用任何其他库来输入地图。@JohnE。谢谢我试着把这两部分分开,使最后一部分更像是奖金,其他和OP处境不同的读者可以使用。简洁而足智多谋的解决方案。但这不会按频率对输出进行排序。@schwobaseglg是的,他不想按频率排序。它发生的顺序,这将适用于所有事情。他总是可以根据自己的需要修改它,比如只需要整数之类的。现在我明白了为什么没人打扰。。。你完全正确“发生次数”显然与“发生次数”不同+来自meIt的1必须符合以下顺序occurrence@RayyanMerchant对不起,我在你的问题中漏掉了。请参阅编辑后的答案,该答案现在按出现顺序进行跟踪和打印。任何反对者都可以评论为什么反对?
System.out.println("Number\tFrequency");
for (int i = 0; order[i] != 0; i++)
System.out.println(order[i] + "\t" + counts[order[i] - '0']);
Enter an integer number
56464
Number Frequency
5 1
6 2
4 2
public static void main(String[] args) {
System.out.println("Enter an integer number");
String sb = new Scanner(System.in).nextLine();
char[] order = new char[10];
int[] counts = new int[10];
for (int i = 0, j = 0; i < sb.length(); i++)
if (counts[sb.charAt(i) - '0']++ == 0)
order[j++] = sb.charAt(i); // First occurrence of the digit
System.out.println("Number\tFrequency");
for (int i = 0; order[i] != 0; i++)
System.out.println(order[i] + "\t" + counts[order[i] - '0']);
}
for (int i = 0, j = 0; i < sb.length(); i++) {
char ch = sb.charAt(i);
if (Character.isDigit(ch)) {
if (counts[ch - '0']++ == 0)
order[j++] = ch; // First occurrence of ch
}
}