Java HashMap:如果字符串包含字符串的一部分,是否将其与值匹配?

Java HashMap:如果字符串包含字符串的一部分,是否将其与值匹配?,java,android,hashmap,Java,Android,Hashmap,我有一个文本文件,在布局中填充了许多行代码:“fiesta,ford”。我用新的BufferedReader(新的InputStreamReader(…)阅读这些行,然后在我的应用程序中显示它们 此方法findCar()获取一个输入,将其与从文本文件中获取的hashmap键进行比较,如果匹配,则在另一个布局部分中显示汽车型号和卡品牌:)。例如:有没有可能使我的代码更高级一点?假设用户输入Fiesta 2018或Fiesta 2019。我希望它被接受。所以我想说,如果给定的字符串包含“Fiesta

我有一个文本文件,在布局中填充了许多行代码:“fiesta,ford”。我用
新的BufferedReader(新的InputStreamReader(…)
阅读这些行,然后在我的应用程序中显示它们

此方法
findCar()
获取一个输入,将其与从文本文件中获取的hashmap键进行比较,如果匹配,则在另一个布局部分中显示汽车型号和卡品牌:)。例如:有没有可能使我的代码更高级一点?假设用户输入Fiesta 2018或Fiesta 2019。我希望它被接受。所以我想说,如果给定的字符串包含“Fiesta”,将其与“ford”匹配并显示它们。我不知道如何让它适用于所有其他品牌,我也不想有100条if语句

对于新手的问题,我很抱歉,我已经尝试了很多版本,比如
else if(car.equalsIgnoreCase(carItem.getKey()){
,但我无法让它工作

   public String findCar(String car) {
    String x = "";
    for (HashMap.Entry<String, String> carItem: itemsMap.entrySet()) {
        if (carItem.getKey().equalsIgnoreCase(car)){
        x = x + "Found " + carItem.getKey() + " in:" + carItem.getValue();
        return x;
    }
}
return "Sorry, not found :D";}
公共字符串findCar(字符串车){
字符串x=“”;
对于(HashMap.Entry carItem:itemsMap.entrySet()){
if(carItem.getKey().equalsIgnoreCase(car)){
x=x+“在“+carItem.getValue()”中找到“+carItem.getKey()+”;
返回x;
}
}
返回“对不起,找不到:D”;}

您应该尝试以下代码(使用“contains”函数并将两个字符串转换为一个大小写):

公共字符串findCar(字符串车){
字符串carLowerCase=car.toLowerCase().trim();
字符串x=“”;
对于(HashMap.Entry carItem:itemsMap.entrySet()){
String key=carItem.getKey().toLowerCase().trim();
if(carLowerCase.contains(key)){
x=x+“在“+carItem.getValue()”中找到“+carItem.getKey()+”;
返回x;
}
}
返回“对不起,找不到:D”;
}

您想优化关键字

例如,在

2018嘉年华

你只需要嘉年华的部分,所以如果最后四个字母是数字,你只需删除它就行了

例如:

Map<String,String> modelBrand = new HashMap<>();
String keyword = "Fiesta 2018";
String[] keys = keyword.split(" [0-9]{4}");
if(keys.length > 0) {
    keyword = keys[0];
}
// Print not found since nothing in the map.
System.out.println(modelBrand.getOrDefault(keyword.toLowerCase(), "Not found"));
modelBrand.put("fiesta", "ford");
// Print ford as it finds the fiesta keyword.
System.out.println(modelBrand.getOrDefault(keyword.toLowerCase(), "Not found"));
Map modelBrand=newhashmap();
String关键字=“嘉年华2018”;
String[]keys=keyword.split(“[0-9]{4}”);
如果(keys.length>0){
关键字=键[0];
}
//未找到打印,因为地图中没有任何内容。
System.out.println(modelBrand.getOrDefault(关键字.toLowerCase(),“未找到”);
modelBrand.put(“嘉年华”、“福特”);
//在找到fiesta关键字时打印ford。
System.out.println(modelBrand.getOrDefault(关键字.toLowerCase(),“未找到”);

更好的方法是利用搜索引擎,比如开源solr。

在你的HashMap中,键代表什么?值代表什么?@RyanH。键代表模型,值代表公司。例如,当有人键入micra 2019时,它的值将是日产。因此,它是一个HashMap。也许它不是ke sense但我这样做是出于教育原因您在这里并没有真正了解
HashMap
。您只是在迭代。它可以是任何集合。@user207421仍然,对这个问题有什么建议吗?没有,但谢谢!!非常感谢您的回答,我理解:)不客气!这里有segmen的概念也就是说,对于给定的关键字。例如“fiesta 2018”,您可以将其分为“fiesta 2018”、“fiesta 201”、“fiesta 20”、“fiesta 2”、“fiesta”、“fiesta”等。最好在地图中放置东西时这样做,这样,查找部分会更快,只是一个containsKey()可以。你也可以在搜索时这样做,但速度会慢一些。这是solr的基本概念。你可以利用它。如果用户键入“2018嘉年华”这将不起作用。如果用户可以键入任何文本进行搜索,则此解决方案不够健壮。对!这就是为什么您要引入solr的机制。您可以在输入为“2018嘉年华”时说,然后可以搜索所有内容:“2018嘉年华”、“018嘉年华”、“2018嘉年华”……当然,您可能不想看到这里的所有废话.简单地将关键词分为2018、嘉年华和18就可以了。对于所有结果,对它们进行排名。
Map<String,String> modelBrand = new HashMap<>();
String keyword = "Fiesta 2018";
String[] keys = keyword.split(" [0-9]{4}");
if(keys.length > 0) {
    keyword = keys[0];
}
// Print not found since nothing in the map.
System.out.println(modelBrand.getOrDefault(keyword.toLowerCase(), "Not found"));
modelBrand.put("fiesta", "ford");
// Print ford as it finds the fiesta keyword.
System.out.println(modelBrand.getOrDefault(keyword.toLowerCase(), "Not found"));