Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.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 使用hashmap获取所有作为键的子字符串及其作为值的发生率_Java_String_Hashmap - Fatal编程技术网

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;
    }    
}