0

我编写了一个代码来检查字符串是否在给定 Map 中有键,并将键替换为字符串中的值。下面是代码

            String s ="VamshiKrishnaA";
    Map<String,String> h = new HashMap<String,String>();
    h.put("Vamshi", "89");
    h.put("VamshiKrishnaA","dataDir");
    h.put("VamshiKrishna","dataDira");

    h.put("VamshiK", "krihsn");

    String key="";

    Iterator<String> i =h.keySet().iterator();
    while(i.hasNext()){
        key=i.next();
        if(s.contains(key)){
            s=s.replace(key, h.get(key));
        }
    }
    System.out.println(s);

当我运行上面的代码时,我得到了 dataDiraA 的输出,但我需要输出为 dataDir。

我无法控制自动生成的键和值的顺序。

在这方面需要任何帮助

4

4 回答 4

4

您需要跟踪当前匹配键的长度,并且只使用最长的一个:

String matchedKey = null;

while (i.hasNext()) {
    key = i.next();
    if (s.contains(key) && (matchedKey == null || matchedKey.length() < key.length())) {
        matchedKey = key;
    }
}
if (matchedKey != null) {
    s = s.replace(matchedKey, h.get(matchedKey));
}
于 2012-07-30T07:49:03.697 回答
0

你应该打电话equals()而不是contains()

if(s.equals(key))
于 2012-07-30T07:44:37.883 回答
0

如果有某种方法可以对键进行排序,例如按长度,您可能会查看 TreeMap,其中所有键都将使用提供的比较器进行排序。

另一方面,如果没有太多键并且您知道确切的顺序,您可能只使用 LinkedHashMap。这样,键将按照您放置它们的顺序进行迭代。像这样:

String s = "VamshiKrishnaA";
Map<String, String> h = new LinkedHashMap<String, String>();
h.put("VamshiKrishnaA", "dataDir");
h.put("VamshiKrishna", "dataDira");
h.put("VamshiK", "krihsn");
h.put("Vamshi", "89");

for (String key : h.keySet()) {
    if (s.contains(key)) {
        s = s.replace(key, h.get(key));
    }
}
System.out.println(s);
于 2012-07-30T07:48:47.870 回答
0

contains() checks for a sub string , where as equals() checks for whole string , and other difference is , contains() takes object of CharSequence class where as equals() takes Object as its parameter !

使用 equals() 方法 ::

            String s = "VamshiKrishnaA";
        Map<String, String> h = new HashMap<String, String>();
        h.put("Vamshi", "89");
        h.put("VamshiKrishnaA", "dataDir");
        h.put("VamshiKrishna", "dataDira");

        h.put("VamshiK", "krihsn");

        String key = "";

        Iterator<String> i = h.keySet().iterator();
        while (i.hasNext()) {
            key = i.next();
            if (s.equals(key)) {
                //s = s.replace(key, h.get(key));
                System.out.println(h.get(key));
            }


        }
于 2012-07-30T08:05:53.787 回答