Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哈希集包含精确字符位置和不正确字符位置_Java_Contains_Hashset - Fatal编程技术网

Java 哈希集包含精确字符位置和不正确字符位置

Java 哈希集包含精确字符位置和不正确字符位置,java,contains,hashset,Java,Contains,Hashset,我有一个类来确定2个字符数组中有多少个匹配字符。使用HashSetcontains方法,如果一个字符数组包含来自第二个数组的字符,则显示该字符。 问题是如果我们有两个匹配的字符出现在多个位置 例如,如果array 1=adcd和array 2=a05ddd,d出现3次,而不是2次。 我将如何修改它以考虑正确的字符计数?代码在应该生成“添加”时生成“添加” 对于不正确的字符,结果将是 “a--dd” HashSet hash=newhashset(); 字符串word1=“adcd”; 字符串wo

我有一个类来确定2个字符数组中有多少个匹配字符。使用
HashSet
contains方法,如果一个字符数组包含来自第二个数组的字符,则显示该字符。
问题是如果我们有两个匹配的字符出现在多个位置

例如,如果
array 1=adcd
array 2=a05ddd
d
出现3次,而不是2次。
我将如何修改它以考虑正确的字符计数?代码在应该生成“添加”时生成“添加” 对于不正确的字符,结果将是
“a--dd”

HashSet hash=newhashset();
字符串word1=“adcd”;
字符串word2=“a05ddd”;
char[]ch1=word1.toCharArray();
char[]ch2=word2.toCharArray();
字符=null;
字符串charLocation=“”;
整数计数=0;
对于(int i=0;i
很有可能需要收集有关字符频率的数据,因此应使用地图替换set。然后,可以根据两个单词中字符的公共字符最小频率构建结果字符串:

//为单词/字符串构建频率映射的助手方法
专用静态映射freqMap(字符串字){
返回word.chars()
.mapToObj(c->(char)c)
.collect(Collectors.toMap(x->x,x->1,Integer::sum,LinkedHashMap::new));
}
静态字符串公用(字符串w1、字符串w2){
如果(空==w1 |空==w2){
返回null;
}
Map map1=频率Map(w1);
Map map2=频率Map(w2);
Set commonChars=newlinkedhashset(map1.keySet());
commonChars.retainal(map2.keySet());
返回commonChars.stream()
.map(x->String.valueOf(x).重复(Math.min(map1.get(x),map2.get(x)))
.collect(收集器。连接(“”);
}
测试:

System.out.println(“common=”+common(“adcd”、“a05ddd”));
输出:

common = add
Java version: 1.8.0_201
common = add
common(adcd, ad05dd) = ad--d
common(adcd, d05add) = d--ad
common(adcd, d05dadd) = d--da

更新

从Java 11开始,可以使用
String::join
+
Collections.nCopies将其替换为与Java 8兼容的代码:

静态字符串公共(字符串w1、字符串w2){
如果(空==w1 |空==w2){
返回null;
}
Map map1=频率Map(w1);
Map map2=频率Map(w2);
Set commonChars=newlinkedhashset(map1.keySet());
commonChars.retainal(map2.keySet());
返回commonChars.stream()
.map(x->String.join(“,Collections.nCopies(Math.min(map1.get(x),map2.get(x)),String.valueOf(x)))
.collect(收集器。连接(“”);
}
:

System.out.println(“Java版本:+System.getProperty(“Java.version”));
System.out.println(“common=”+common(“adcd”、“a05ddd”);
输出:

common = add
Java version: 1.8.0_201
common = add
common(adcd, ad05dd) = ad--d
common(adcd, d05add) = d--ad
common(adcd, d05dadd) = d--da

更新2

为了保持结果中第二个字符串中字符的顺序,并用
'-'
替换缺少的字符,可以实现以下方法:

静态字符串common2(字符串w1、字符串w2){
如果(空==w1 |空==w2){
返回null;
}
Map map1=频率Map(w1);
StringBuilder sb=新的StringBuilder();
for(char c:w2.toCharArray()){
if(map1.containsKey(c)和&map1.get(c)>0){
sb.附加(c);
merge(c,-1,Integer::sum);//减少第一个映射中的字符计数器
}else如果(!map1.containsKey(c)){//第一个单词中缺少字符
某人附加('-');
}
}
使某人返回字符串();
}
测验

String[][]测试={
{“adcd”,“ad05dd”},
{“adcd”,“d05add”},
{“adcd”,“d05dadd”},
};
for(字符串[]测试:测试){
System.out.printf(“公共(%s,%s)=%s%n”,测试[0],测试[1],公共(测试[0],测试[1]);
}
输出:

common = add
Java version: 1.8.0_201
common = add
common(adcd, ad05dd) = ad--d
common(adcd, d05add) = d--ad
common(adcd, d05dadd) = d--da

仅供参考,Java中的
char
Character
类型已经过时,甚至无法表示Unicode中定义的一半字符。了解用于表示每个字符的整数。如果第二行只有一个字符
d
“a05d123”
),那么
公共
结果应该是
ad
吗?您好,我得到一个错误“无法推断map的类型参数”(function)您使用的是哪个版本的Java/JDK?JavaSE-1.8(jdk-11.0.1)更新为兼容Java 8的版本,
String::repeat
从Java 11开始提供谢谢。如果我想保持字符的顺序,我该怎么做?我尝试了一个链接映射,但没有成功,因为如果我是正确的,代码将所有类似的字符连接在一起。(我将在今天晚些时候查找这些方法,以真正了解它们是如何组合在一起的)。介意我明天用我认为代码正在做的事情的书面形式回复这个评论,您可以检查我是否正确吗?