如何使字符串比较具有包容性?

dsf9zpds  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(189)

我有一个包含单词及其定义的树状图。我正在编写一个方法,它将返回所有单词及其定义的范围;它包含两个参数: string begin 以及 string end . 到目前为止,我在函数外部初始化了一个树Map:

Map<String, List<String>> wordDictionary = new TreeMap<String, List<String>>();
Set<String> wordSet = wordDictionary.keySet();
    Iterator<String> iterator = wordSet.iterator();
    while (iterator.hasNext()) {
      String current = iterator.next();
      if (
        (current.compareToIgnoreCase(begin) >= 0) &&
        (current.compareToIgnoreCase(end) <= 0)
      ) {
        List<String> defList = wordDictionary.get(current);
        System.out.println(current);
        Iterator<String> itr2 = defList.iterator();
        while (itr2.hasNext()) {
          System.out.println(" " + itr2.next());
        }
      }
    }

示例用法:“list a b”方法应返回 ab 但是,我的方法返回 a 以及 b ; 它不包括以 a 以及 b .
我试着把这个案子改成

if (
        (current.compareToIgnoreCase(begin) > 0) &&
        (current.compareToIgnoreCase(end) < 0)
      )

但这也不管用。它显示以开头的单词 begin 但不是 end . 希望这有道理。

bogh5gae

bogh5gae1#

获取所有以。 'b' ,使用 subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) :

TreeMap<String, String> wordDictionary = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
wordDictionary.put("A", "1");
wordDictionary.put("Abc", "2");
wordDictionary.put("Axe", "3");
wordDictionary.put("B", "4");
wordDictionary.put("Bee", "5");
wordDictionary.put("C", "6");
wordDictionary.put("Car", "7");

NavigableMap<String, String> bdict = wordDictionary.subMap("b", true, "c", false);
System.out.println(bdict);
System.out.println(bdict.keySet());

// Alternative
NavigableSet<String> bwords = wordDictionary.navigableKeySet().subSet("b", true, "c", false);
System.out.println(bwords);

输出

{B=4, Bee=5}
[B, Bee]
[B, Bee]
kkih6yb8

kkih6yb82#

通过执行以下操作,可以使treemap的子Map两端都包含在内:

TreeMap<String,String> map = new TreeMap<>();

map.put("abc","a");     
map.put("efg","a");      
map.put("hij","v");      
map.put("rst","o");

String start = "a";
String end = "e";

int idx = end.length() - 1;

// modify last character of end to be inclusive.
 StringBuilder sb = new StringBuilder(end);
 char c = sb.charAt(sb.length()-1);
 sb.setCharAt(sb.length()-1, (char)(c+1));
 end = sb.toString();

Map<String, String> words =
        map.subMap(start, true, end,false);

System.out.println(words);

印刷品

{abc=a, efg=a}

它增加结束字符串的最后一个字符,以便包含任何小于该字符的内容。

sdnqo3pr

sdnqo3pr3#

如果你有树状图,用它的 subMap() 方法!

Map<String, List<String>> range = wordDictionary.subMap(begin, true, end, true);

在整个Map上迭代。
第2个和第4个参数控制范围结束是否包含-似乎您希望两端都包含,但如果不包含,请将第4个参数更改为 false .
——
顺便说一下,由于您不打印单词,只打印定义,因此您的代码可以简化为:

wordDictionary.subMap(begin, true, end, true).values().stream()
.flatMap(List::stream)
.forEach(System.out::println);

如果您还想在缩进定义之前打印单词:

wordDictionary.subMap(begin, true, end, true).entrySet().stream()
.peek(e -> System.out.println(e.getKey()))
.map(Map.Entry::getValue)
.flatMap(List::stream)
.forEach(d -> System.out. println(" " + d);

相关问题