Java 字符串中的数字频率

Java 字符串中的数字频率,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

我应该这样做:

对于输入数字,按出现顺序打印每个数字的频率。例如: 输入: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(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
    }
}