为了账号安全,请及时绑定邮箱和手机立即绑定

查找给定字符串中每个字符的出现

查找给定字符串中每个字符的出现

holdtom 2023-04-19 10:12:05
“我想查找并打印给定字符串中每个字符的出现,我已经建立了自己的逻辑,但存在一些问题。例如,如果我将输入作为“ JAVA”输入。 我的程序产生的输出将是J 1A 2V 1A 1预期输出:    J 1    A 2    V 1我不想再打印 A 了。我希望你们都能明白我的代码中有什么问题。”导入 java.util.Scanner;公共类 FindOccuranceOfCharacter {public static void main(String[] args) {    // TODO Auto-generated method stub    String x;    Scanner input = new Scanner(System.in);    System.out.println("Enter a string");    x = input.nextLine();    x = x.toUpperCase();    int size = x.length();    for(int i =0;i<size;i++) {        int count=1;        char find = x.charAt(i);        for(int j=i+1;j<size;j++) {            if(find == x.charAt(j)) {                count++;            }        }        System.out.printf("%c\t%d",x.charAt(i),count);        System.out.println();           }}}
查看完整描述

3 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

您的代码以这种方式打印的原因是您的循环打印给定索引的每个字符(和后续匹配项)。你真的需要用一个循环将字符和计数存储在一个数据结构中,然后用第二个循环显示计数。ALinkedHashMap<Character, Integer>非常适合您的用例(因为它保留了键插入顺序,不需要额外的逻辑来恢复输入顺序)。我将进行的其他更改包括使用String.toCharArray()for-each循环。

Map<Character, Integer> map = new LinkedHashMap<>();

for (char ch : x.toUpperCase().toCharArray()) {

    map.put(ch, map.getOrDefault(ch, 0) + 1);

}

for (char ch : map.keySet()) {

    System.out.printf("%c\t%d%n", ch, map.get(ch));

}

我用xequal测试JAVA并得到了(按要求)


J   1

A   2

V   1

喜欢,

查看完整回答
反对 回复 2023-04-19
?
森林海

TA贡献2011条经验 获得超2个赞

使用 hashMap 可以很容易地累积出现的次数,并且可以轻松地打印迭代 HashMap。


这是代码:


public class FindOccuranceOfCharacter {


public static void main(String[] args) {


    String x;

    Scanner input = new Scanner(System.in);

    System.out.println("Enter a string");

    x = input.nextLine();

    HashMap<Character,Integer> occurance = new HashMap<Character,Integer>();


    x = x.toUpperCase();

    int size = x.length();

    for(int i =0;i<size;i++) {

        int count=1;

        char find = x.charAt(i);


        occurance.put(find, occurance.getOrDefault(find, 0) + 1);


    }


    for (Character key : occurance.keySet()) {

        Integer value = occurance.get(key);

        System.out.println("Key = " + key + ", Value = " + value);

    }   

}


查看完整回答
反对 回复 2023-04-19
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

这不是最佳解决方案,但我已尝试尽可能少地更改您的代码:


public static void main(String args[]) {

    Scanner input = new Scanner(System.in);

    System.out.println("Enter a string");

    // use a StringBuilder to delete chars later on

    StringBuilder x = new StringBuilder(input.nextLine().toUpperCase());

    for(int i=0;i<x.length();i++) {

        int count=1;

        char find = x.charAt(i);


        // go through the rest of the string from the end so we do not mess up with the index

        for(int j=x.length()-1;j>i;j--) {

            if(find == x.charAt(j)) {

                count++;

                // delete counted occurences of the same char

                x.deleteCharAt(j);

            }

        }


        System.out.printf("%c\t%d",x.charAt(i),count);

        System.out.println();       

    }

}

我更喜欢的Java 流如下所示:


input.nextLine().toUpperCase().chars()

        .mapToObj(i -> (char) i)

        .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting()))

        .forEach((k, v) -> System.out.println(k + "\t" + v));


查看完整回答
反对 回复 2023-04-19
  • 3 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信