Java 如何匹配以或等于搜索字符串开头的树映射值

Java 如何匹配以或等于搜索字符串开头的树映射值,java,regex,treemap,Java,Regex,Treemap,我有一张树图 TreeMap<String,HashSet<String>> kewordVideo = new TreeMap<String,HashSet<String>>(); 我想打印以或等于searchString开头的树映射的所有值 例如,树映射有以下键值对 v1 abc v2 abd v3 bcd v4 bad 而searchString是一个 所以输出应该是 v1 v2 因为它们都以v4开头,所以不应作为输出的一部分

我有一张树图

    TreeMap<String,HashSet<String>> kewordVideo = new TreeMap<String,HashSet<String>>();
我想打印以或等于searchString开头的树映射的所有值

例如,树映射有以下键值对

v1 abc
v2 abd
v3 bcd
v4 bad
而searchString是一个

所以输出应该是

v1 v2 
因为它们都以v4开头,所以不应作为输出的一部分,因为它不以a或等于a开头 这是完整的代码。输入搜索键后没有输出

 package cultureMachine;

 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeMap;

 public class CultureMachineAssignment {

 TreeMap<String,HashSet<String>> kewordVideo = new      TreeMap<String,HashSet<String>>();
TreeMap<String,HashSet<String>> videoKeyword =  new TreeMap<String,HashSet<String>>();
TreeMap<String,Integer> keywordLength = new TreeMap<String,Integer>();

   public static void main(String args[]) throws IOException {

     CultureMachineAssignment obj1 = new CultureMachineAssignment();


     Integer previousVal=0;
     InputStreamReader ip = new InputStreamReader(System.in);
     BufferedReader br = new BufferedReader(ip);

     for(int i=0;i<5;i++){
        System.out.println("Enter Video name");
        String video =br.readLine();


        if(!obj1.videoKeyword.containsKey(video)){
            obj1.videoKeyword.put(video,new HashSet<String>());
        }

        System.out.println("Enter keywords for video");
        String keyword =br.readLine();

        if(!obj1.keywordLength.containsKey(video))
            obj1.keywordLength.put(video, 0);

        if((obj1.keywordLength.get(video)+keyword.length())<5){
            obj1.videoKeyword.get(video).add(keyword);
            previousVal=obj1.keywordLength.get(video);
            obj1.keywordLength.put(video, previousVal+keyword.length());
        }
        else{
            System.out.println("Maximum length exceeded for video "+ video);
            break;
        }
        if(!obj1.kewordVideo.containsKey(keyword)){
            obj1.kewordVideo.put(keyword,new HashSet<String>());
        }
        obj1.kewordVideo.get(keyword).add(video);


    }
    for(Map.Entry m:obj1.videoKeyword.entrySet()){  
        System.out.println(m.getKey()+" "+m.getValue());  
    }
    System.out.println("Enter keyword to search video");
    String searchKey = br.readLine();
    for(Entry<String,HashSet<String>> entry : obj1.kewordVideo.entrySet()){    
                  if(entry.getValue().contains(searchKey))
                     System.out.println(entry.getKey());

                }
        }   
 }
包装文化机;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.util.HashSet;
导入java.util.Map;
导入java.util.Map.Entry;
导入java.util.Set;
导入java.util.TreeMap;
公共类文化机器分配{
TreeMap kewordVideo=newtreemap();
TreeMap videoKeyword=新的TreeMap();
TreeMap关键字长度=新建TreeMap();
公共静态void main(字符串args[])引发IOException{
CultureMachine Assignment obj1=新的CultureMachine Assignment();
整数previousVal=0;
InputStreamReader ip=新的InputStreamReader(System.in);
BufferedReader br=新的BufferedReader(ip);
对于(int i=0;i这应该可以:

TreeMap<String,HashSet<String>> videoKeyword = new TreeMap<String,HashSet<String>>();
videoKeyword.put("v1", new HashSet<String>(Arrays.asList("abc")));
videoKeyword.put("v2", new HashSet<String>(Arrays.asList("abd")));
videoKeyword.put("v3", new HashSet<String>(Arrays.asList("bcd")));
videoKeyword.put("v4", new HashSet<String>(Arrays.asList("bad")));

String searchString = "a";

for (Entry<String, HashSet<String>> entry : videoKeyword.entrySet()) {
    for (String s : entry.getValue()) {
        if (s.startsWith(searchString)) {
            System.out.println(entry.getKey());
            break;
        }
    }
}

我认为您可以通过在树映射中迭代条目集并使用hash set的contains方法测试搜索字符串来确定哪些键具有包含搜索词的值

for(Entry<String,HashSet<String>> entry : kewordVideo.entrySet()){     
  if(entry.getValue.contains(searchString){
    //Do something with entry.getKey(), ie add to a list or output to console
  }
}
for(条目:kewordVideo.entrySet()){
if(entry.getValue.contains)(searchString){
//对entry.getKey()执行操作,即添加到列表或输出到控制台
}
}

您忘了解释阻止您编写自己的解决方案的问题。您面临的问题是什么?您知道如何迭代映射键值对吗?是的,我知道我想使用正则表达式
if(obj1.kewordVideo.containsKey(searchKey))来完成它
这是给我的如果搜索字符串完全匹配如何开始,你能添加到你正在使用的问题代码吗?还可以解释为什么你认为你需要正则表达式(你看过
startsWith
methodfrom string吗)?总之,你的问题是“我想打印以或等于搜索字符串开始的树映射的所有值”有点混乱,因为树映射的值是字符串的哈希集,而不是单个字符串对象。那么如何确定哪个哈希集适合
searchString
?它的哈希集不是hashmapfor
for(字符串s:entry){
我遇到以下错误
只能迭代java.lang.Iterable的数组或实例
。我们也可以像使用TreeMapI一样使用HashSet,在编辑中修复了这一错误。
HashSet
实际上是
entry.getValue()
。是否有必要对每个hashset的整个字符串集进行迭代?@adam5990,有必要,因为要求字符串以搜索词开头。如果字符串相等,
hashset.contains()
可以直接工作,而不是内部for-loop。啊,是的,你是对的,我应该更仔细地阅读这个问题。但是,在这种情况下,在迭代字符串集中的字符串之前,你不能通过使用contains first测试来获得一个小的性能提升,因为如果没有一个值是co,那么迭代就没有意义了是否输入字符串?这不是显示输出我尝试过调试它也没有得到调试
v1
v2
for(Entry<String,HashSet<String>> entry : kewordVideo.entrySet()){     
  if(entry.getValue.contains(searchString){
    //Do something with entry.getKey(), ie add to a list or output to console
  }
}