当前位置: 首页 > 知识库问答 >
问题:

Java:通过匹配LinkedHashMap中的相似键来复制值

毋举
2023-03-14

我有一个LinkedHashMap,想做以下事情:

    null
HashMap<String, String> nameNum = new LinkedHashMap<String, String>();
nameNum.put("row 1", "data 1");
nameNum.put("Group_Colour_R", "Red");
nameNum.put("Group_Colour_B", "Blue");
nameNum.put("row 4", "data 4");
nameNum.put("row 5", "data 5");
nameNum.put("Group_Shape_R", "Rectangle");
nameNum.put("Group_Shape_T", "Triangle");
nameNum.put("Group_Shape_C", "Circle");
nameNum.put("row 9", "data 9");
nameNum.put("row 10", "data 10");
nameNum.put("row 11", "data 11");
String[] colour = {"Red", "Blue"}; 
String[] shape = {"Rectangle", "Triangle", "Circle"};
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;

import org.apache.commons.lang3.StringUtils;

public class MainClass {
    public static void main(String[] args) {
        SortedMap<String, String> nameNum = new TreeMap<String, String>();
        nameNum.put("row 1", "data 1");
        nameNum.put("Group_Colour_R", "Red");
        nameNum.put("Group_Colour_B", "Blue");
        nameNum.put("row 4", "data 4");
        nameNum.put("row 5", "data 5");
        nameNum.put("Group_Shape_R", "Rectangle");
        nameNum.put("Group_Shape_T", "Triangle");
        nameNum.put("Group_Shape_C", "Circle");
        nameNum.put("row 9", "data 9");
        nameNum.put("row 10", "data 10");
        nameNum.put("row 11", "data 11");


        for (Map.Entry<String, String> entry : nameNum.entrySet()) {
            String prefix = entry.getKey();
            if (prefix.contains("Group")) {
                prefix = prefix.substring(0, StringUtils.lastIndexOf(prefix, "_"));
                System.out.println("******");
                for (Map.Entry<String, String> entry1 : filterPrefix(nameNum, prefix).entrySet()) {
                    System.out.println(entry1);
                }
                System.out.println("******");
            }
        }
    }

    public static <V> SortedMap<String, V> filterPrefix(SortedMap<String,V> baseMap, String prefix) {
        if(prefix.length() > 0) {
            char nextLetter = (char) (prefix.charAt(prefix.length() -1) + 1);
            String end = prefix.substring(0, prefix.length()-1) + nextLetter;
            return baseMap.subMap(prefix, end);
        }
        return baseMap;
    }
}

理想情况下,我希望使用LinkedHashMap,因为我希望保留顺序。我非常感谢关于如何实现类似内容的任何指针/代码。任何代码片段都将受到高度赞赏。提前谢了。

共有1个答案

丁学
2023-03-14

也许Java8StreamAPI在这里会有所帮助。您可以尝试使用collectors.groupingby,将相关条目分组在一起:

Map<String,List<String>> groups =
    nameNum.entrySet()
           .stream()
           .filter(entry -> entry.getKey().contains("Group"))
           .collect(Collectors.groupingBy(entry -> entry.getKey().substring(0, entry.getKey().lastIndexOf("_")),
                                          Collectors.mapping(Map.Entry::getValue,
                                                             Collectors.toList()));

这将生成一个映射包含:

{Group_Shape=[Rectangle, Triangle, Circle], Group_Colour=[Red, Blue]}

如果愿意,还可以强制输出mapLinkedHashmap:

Map<String,List<String>> groups =
    nameNum.entrySet()
           .stream()
           .filter(entry -> entry.getKey().contains("Group"))
           .collect(Collectors.groupingBy(entry -> entry.getKey().substring(0, entry.getKey().lastIndexOf("_")),                     
                                          LinkedHashMap::new, 
                                          Collectors.mapping(Map.Entry::getValue,
                                                             Collectors.toList()));

这将改变输出映射的迭代顺序:

{Group_Colour=[Red, Blue], Group_Shape=[Rectangle, Triangle, Circle]}
 类似资料:
  • 问题内容: 我正在编写一个简单的调试程序,该程序将简单的字符串作为输入,其中可以包含星号以指示通配符匹配-任何 我以为我会简单地采用该模式,转义其中的任何正则表达式特殊字符,然后将其替换为。然后使用正则表达式匹配器。 但是我找不到任何Java函数来转义正则表达式。我能找到的最佳匹配,然而这正好将与在开始和字符串的结尾。 Java中有什么可以让您简单地进行通配符匹配而不必从头开始实现算法的? 问题答

  • 问题内容: 我有一对对。是否可以精确匹配&的值,然后检查其范围值? 示例:在doc下面是一个带有名称,值对的数组。我需要检查它是否具有键,然后检查它的值是否小于1000。 以下是我的过滤器。 我还需要检查以下内容,以便返回结果 “ client.name”必须是“ Athena” “ client.db。@ type”必须为“ Oracle”,然后继续进行以下检查 找不到“ client.db.o

  • 例如,尝试在特定代码后提取子字符串 上面的代码工作正常,但现在我需要在下面的示例的正则表达式中再添加一个标识符“/CODER/” 我试过了 但这不起作用。伙计们有什么建议吗? 谢谢

  • 我最近不得不迁移我的应用程序,复制并粘贴了一大堆代码。现在,当我构建项目时,我会在控制台中获得通常的firebase输出,但这次它是重复的。有谁知道可能导致这种情况的原因。代码太多,我无法完成

  • 问题内容: 如何匹配MySQL中单词的变体,例如,对会计的搜索应与会计,会计,会计等匹配。我在共享主机上,因此不能向levenshtein等MySQL添加任何功能。 我想类似谷歌如何匹配“的东西 会计课程 ”和“ 会计课程 ”的“搜索时, 会计师课程 ”。例子。 我的服务器语言是php,如果只能在其中实现而不是在SQL中实现。 当前语句如下。 问题答案: MySQL在全文搜索方面不是很好,您可能想

  • 我编写了一个尝试将对象转换为日期的类。