Java 使用hashmap获取所有作为键的子字符串及其作为值的发生率
问题:给定一个字符串,我想使用Java 使用hashmap获取所有作为键的子字符串及其作为值的发生率,java,string,hashmap,Java,String,Hashmap,问题:给定一个字符串,我想使用哈希映射获取length=k的所有子字符串 因此,我声明了一个public static函数get直方图返回Map并尝试使用HashMap获取给定字符串的所有子字符串(作为键),以及字符串中已经发生的每个子字符串,我想增加其键中的值(将是计数器) 这就是我目前得到的:Currenet输出:输出不符合预期 import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; impo
哈希映射
获取length=k
的所有子字符串
因此,我声明了一个public static函数get直方图
返回Map
并尝试使用HashMap获取给定字符串的所有子字符串(作为键),以及字符串中已经发生的每个子字符串,我想增加其键中的值(将是计数器)
这就是我目前得到的:Currenet输出:输出不符合预期
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Iterator;
import java.util.Set;
public class Main2{
public static void main(String[] args) throws InvalidValueException{
// Get a set of the entries
Set set = Main2.getHistogram("ababaca", 5).entrySet();
// Get an iterator
Iterator i = set.iterator();
// Display elements
while(i.hasNext()) {
Map.Entry me = (Map.Entry)i.next();
System.out.print(me.getKey() + ": ");
System.out.println(me.getValue());
}
System.out.println();
}
public static Map<String,Integer> getHistogram(String str, int k)
throws InvalidValueException
{
int i,j;
String tempStr;
Map<String, Integer> hmap = new HashMap<String, Integer>();
for(i = 0; i < str.length(); i++)
{
for(j=i; j < str.length(); j++){
tempStr = str.substring(i, j);
int count = hmap.containsKey(tempStr) ? hmap.get(tempStr) : 0;
hmap.put(tempStr, count + 1);
}
}
return hmap;
}
}
使用Java 8,您可以以一种简单的方式完成这项工作:
public static Map<String, Long> getHistogram(String string, int k) {
return
k > string.length() ? Collections.emptyMap() :
k == string.length() ? Collections.singletonMap(string, 1L) :
IntStream.range(0, string.length() - k + 1)
.mapToObj(i -> string.substring(i, i + k))
.collect(Collectors.groupingBy(
Function.identity(),
Collectors.counting()));
}
使用Java 8,您可以以一种简单的方式完成这项工作:
public static Map<String, Long> getHistogram(String string, int k) {
return
k > string.length() ? Collections.emptyMap() :
k == string.length() ? Collections.singletonMap(string, 1L) :
IntStream.range(0, string.length() - k + 1)
.mapToObj(i -> string.substring(i, i + k))
.collect(Collectors.groupingBy(
Function.identity(),
Collectors.counting()));
}
公共类Substr{
公共静态void main(字符串[]args){
System.out.println(getHistogram(“ababaca”,5));
System.out.println(getHistogram(“ababaca”,4));
System.out.println(getHistogram(“ababaca”,3));
System.out.println(getHistogram(“ababaca”,2));
System.out.println(getHistogram(“ababaca”,1));
}
公共静态映射getHistogram(字符串str,int k){
Map hmap=newhashmap();
对于(int start=0;start
这似乎产生了正确的结果
如果k
是固定的,则不需要两个循环,只需要一个。它只是遍历可能的子字符串的开始索引。然后我们获取子字符串,并按照您最初的建议计算子字符串的数量。公共类Substr{
公共静态void main(字符串[]args){
System.out.println(getHistogram(“ababaca”,5));
System.out.println(getHistogram(“ababaca”,4));
System.out.println(getHistogram(“ababaca”,3));
System.out.println(getHistogram(“ababaca”,2));
System.out.println(getHistogram(“ababaca”,1));
}
公共静态映射getHistogram(字符串str,int k){
Map hmap=newhashmap();
对于(int start=0;start
这似乎产生了正确的结果
如果
k
是固定的,则不需要两个循环,只需要一个。它只是遍历可能的子字符串的开始索引。然后我们使用子字符串,并按照您最初的建议计算子字符串的数量。“长度为k”,但我不知道,k在哪里used@matoni我知道,它没有被使用,因为我想先得到所有的长度,成功后,我将对其进行相应的编辑。那么,在从映射中筛选出所有长度为k的子字符串之前,预期的行为是什么?@matoni正如我在前面的评论中提到的,我想输出所有子字符串及其在给定字符串中的出现。“长度为k”,但我看不到,k在哪里used@matoni我知道,它没有被使用,因为我试图首先获得所有长度,当我成功时,我会相应地编辑它。那么,在从映射中筛选出所有长度为k的子字符串之前,预期的行为是什么?@matoni正如我在前面的评论中提到的,我想输出给定字符串中的所有子字符串及其出现的情况。你是对的。我的实现走得太远了。谢谢你,罗曼/你说得对。我的实现走得太远了。谢谢罗曼/这是一个很好的解决方案。但我宁愿坚持使用更易于理解的实现。谢谢@IlanAizelmanWS不用担心,我的答案只是补充了Roman的答案。现在,读者将有两种方法来解决你发布的问题。这是一个很好的解决方案。但我宁愿坚持使用更易于理解的实现。谢谢@IlanAizelmanWS不用担心,我的答案只是补充了Roman的答案。现在读者将有两种方法来解决您发布的问题。
public static Map<String, Long> getHistogram(String string, int k) {
return
k > string.length() ? Collections.emptyMap() :
k == string.length() ? Collections.singletonMap(string, 1L) :
IntStream.range(0, string.length() - k + 1)
.mapToObj(i -> string.substring(i, i + k))
.collect(Collectors.groupingBy(
Function.identity(),
LinkedHashMap::new, // <-- here's the map supplier
Collectors.counting()));
}
public class Substr {
public static void main(String[] args) {
System.out.println(getHistogram("ababaca", 5));
System.out.println(getHistogram("ababaca", 4));
System.out.println(getHistogram("ababaca", 3));
System.out.println(getHistogram("ababaca", 2));
System.out.println(getHistogram("ababaca", 1));
}
public static Map<String, Integer> getHistogram(String str, int k) {
Map<String, Integer> hmap = new HashMap<>();
for (int start = 0; start < str.length() - k + 1; start++) {
String substring = str.substring(start, start + k);
int count = hmap.containsKey(substring) ? hmap.get(substring) : 0;
hmap.put(substring, count + 1);
}
return hmap;
}
}