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