Java 查找字符串中的重复字符

Java 查找字符串中的重复字符,java,string,Java,String,我正在尝试打印字符串中的重复字符,例如,如果字符串输入为:aabacdceefeg输出应为a->3,b->1,c->2,e->3,这样必须打印值,但下面的代码不适用于此逻辑有人能建议我吗 public class Test { public static void main(String[] args) { String string1 = "Great responsibility"; char string[] = string1.

我正在尝试打印字符串中的重复字符,例如,如果字符串输入为:aabacdceefeg输出应为a->3,b->1,c->2,e->3,这样必须打印值,但下面的代码不适用于此逻辑有人能建议我吗

  public class Test {

        public static void main(String[] args) {
             String string1 = "Great responsibility";
      char string[] = string1.toCharArray();
      HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
      for (int i = 0; i < string.length; i++) {
          for (int j = i + 1; j < string.length; j++) {
              if (string[i] == string[j]) {
                 Integer value = hashMap.get(string[i]);
                 hashMap.put(string[i], value+1);
              } else {
                  hashMap.put(string[i], 1);
              }
          }
      }
      System.out.println(hashMap);
    }

   }

您只需要一个级别的循环:

    Map<Character, Integer> map = new HashMap<Character, Integer>();
    for (int i = 0; i < string.length; i++) {
        Integer count = map.get(string[i]);
        if (count == null) {
            map .put(string[i], 1);
        } else {
            map .put(string[i], count+1);
        }
    }

您可以通过直接使用hashMap并仅使用一个循环来简化它

    String string1 = "Great responsibility";

    HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
    for (Character c : string1.toCharArray()) {

        if (hashMap.containsKey(c)) {
            int val  = hashMap.get(c);
            hashMap.put(c, val + 1);
        }
        else {
            hashMap.put(c, 1);
        }
    }
    System.out.println(hashMap);

首先创建一个字符列表,然后在所需字符串上循环

ArrayList<Character> charList=new ArrayList();
charList.clear();

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

if(!charList.Contains(string[i])){
charList.add(string[i]))
}

 }

    HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
    for (Char char:charList) {
      count=0;
        for (int j = i + 1; j < string.length; j++) {
            if (char == string[j]) {
                hashMap.put(char, count++);
            } 
        }
    }
    System.out.println(hashMap);
}

我希望它能对您有所帮助。

关于如何优化解决方案,有很多答案,但没有一个能说明如何修复原始的^2时间复杂度解决方案

除了明显的低效外,原始解决方案中还有一些问题需要解决

如果某个角色在地图中还不存在,则该值应设置为1,因为这是其第一次出现。 如果当前字符不等于另一个字符,则保留其原始计数。 固定代码如下:

public static void main(String[] args) {
    String string1 = "Great responsibility";
    char string[] = string1.toCharArray();
    HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
    for (int i = 0; i < string.length; i++) {
        for (int j = i + 1; j < string.length; j++) {
            Integer value = hashMap.get(string[i]);
            if (value == null) {
                value = 1;
            }
            if (string[i] == string[j]) {
                hashMap.put(string[i], value + 1);
            } else {
                hashMap.put(string[i], value);
            }
        }
    }
    System.out.println(hashMap);
}
您还可以使用Java8 lambda函数来解决这个问题。您可以简单地将字符串转换为计数映射

    String string1 = "aabacdceefeg";
    Map<Character,Long> countMap = string1.chars().mapToObj(i -> (char)i).collect(
            Collectors.groupingBy(Function.identity(), Collectors.counting())
        );
    System.out.println(countMap);

应该可以回答您的问题。count变量设置不正确。您必须在每次迭代后将count变量重置为1。对于此问题,您将在线找到许多解决方案。只需将字符串中的所有字符添加到计数为1的映射中。如果这个字符已经存在于映射中,则增加计数器。我必须在没有HashMap的情况下执行此要求。为什么您的问题中有HashMap。你以前为什么不提这件事?浪费人们的时间。你为什么认为G和G是不同的字符?@Anatolii很容易修复,如果OP要求他们使用相同的字符串string1=Great responsibility.toLowerCase@为什么我上面的代码不起作用?有什么建议吗?我必须在没有HashMap的情况下满足这个要求。为什么你的问题中有HashMap。你以前为什么不提这件事?浪费别人的时间。@Krish那你为什么要用呢?你为什么不在问题中说明这一限制?
public static void main(String[] args) {
    String string1 = "Great responsibility";
    char string[] = string1.toCharArray();
    HashMap<Character, Integer> hashMap = new HashMap<Character, Integer>();
    for (int i = 0; i < string.length; i++) {
        for (int j = i + 1; j < string.length; j++) {
            Integer value = hashMap.get(string[i]);
            if (value == null) {
                value = 1;
            }
            if (string[i] == string[j]) {
                hashMap.put(string[i], value + 1);
            } else {
                hashMap.put(string[i], value);
            }
        }
    }
    System.out.println(hashMap);
}
    String string1 = "aabacdceefeg";
    Map<Character,Long> countMap = string1.chars().mapToObj(i -> (char)i).collect(
            Collectors.groupingBy(Function.identity(), Collectors.counting())
        );
    System.out.println(countMap);