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

使用Lambda表达式使用HashMap替换字符串中的字符

张腾
2023-03-14

因此,我正在处理一个项目,其中我必须将包含希腊字母的字符串转换为包含此字母的英语表示的字符串。因此,希腊α将变为alphaΑ将成为Alpha

我已经创建了一个HashMap,它具有从Unicode字符到普通字符串的适当转换。

我使用了一个简单的For循环来检查输入字符串中的Char是否是HashMap中的,如果是,那么我将使用StringBuilder附加其替换。以下是我用来执行此操作的代码:

char[] ca = snippet.toCharArray();
        StringBuilder out = new StringBuilder();
        for (char c : ca) {
            if (GREEK_LETTER_DICT.containsKey(Character.toString(c))) {
                out.append( GREEK_LETTER_DICT.get(Character.toString(c)));
            } else {
                out.append(c);
            }
        }
    return out.toString();

这是一个公共静态方法,以< code>String作为输入。我想知道的是,是否有可能用lambda表达式做同样的事情?我已经找到了几个替换< code>String中的< code>Character的解决方案,但是它们没有使用< code > HashMap /< code > Dictionary 。

我知道仅仅为了使用lambda表达式而将它转换成lambda表达式是完全没有用的,但是因为我有另外7个这样的函数将我的代码缩短了将近60%,所以我想看看是否有可能在“一行”代码中做到这一点。通过这种方式,我可以减少我使用的独立方法的数量,得到更干净的代码。

到目前为止,我已经找到了一种将<code>字符串

String.chars()

然后将此 IntStream 转换为

.mapToObj(ch -> (char) ch)

并过滤以查看字符是否在哈希映射

.filter(ch -> (GREEK_LETTER_DICT.containsKey(ch)))

问题在于我不能

  1. 如果原始字符不在哈希映射中,则将其附加到输出字符串
  2. 字符替换为哈希映射中的字符串

所以在这两点上的任何帮助都是非常感谢的。我发现有时我会想错了,因为我不应该看String中的Character是否等于选项列表中的Character,我应该检查该选项列表是否返回index。所以这个(PseudeoCode):

< code >“string with options”。indexOf(' character literal ')

而不是这样:

Character.equals(“这些中的一个”)


共有3个答案

桂嘉年
2023-03-14

使用Steams有几个很好的解决方案。我更喜欢简单的:

  • 避免从字符转换为字符串
  • 避免在流管道外使用StringBuffer。
  • 使用预定义收集器
public class ReplaceGreek {

    private Map<String, String> DICT = new HashMap<>();
    {
        DICT.put("α", "alpha");
    }

    public String replace(final String original) {
        return Arrays.stream(original.split(""))
                .map(c -> DICT.getOrDefault(c, c))
                .collect(Collectors.joining());
    }
}

它甚至有效!

public class ReplaceGreekTest {

    @Test
    public void test() {
        ReplaceGreek rg = new ReplaceGreek();
        String greek = "This is greek: α";

        String nogreek = rg.replace(greek);

        assertEquals("This is greek: alpha", nogreek);
    }

}
邓俊英
2023-03-14

我会做这样的事情:

str
    .chars()
    .forEach(
        character -> out.append(
            GREEK_LETTER_DICT.getOrDefault(Character.toString(c), c)
        )
    );
谭绍晖
2023-03-14

怎么样?

public static String replaceGreekLetters(String snippet) {
    return snippet
            .chars()
            .mapToObj(c -> (char) c)
            .map(c -> GREEK_LETTER_DICT.getOrDefault(c, c.toString()))
            .collect(Collectors.joining());
}
 类似资料:
  • 问题内容: 如何在Python中使用正则表达式替换文件中的字符串,因为我想打开一个文件,其中应替换其他字符串的字符串,而我们需要使用Reg表达式(搜索和替换)。有人可以帮助我吗?打开文件并将其与搜索和替换方法一起使用的一些示例 问题答案:

  • 我正在学习正则表达式并尝试处理一个小任务。 我将输入量作为字符串,并将其转换为美元格式。 输入字符串如下所示 输出字符串看起来像这样 使用正则表达式,我试图避免使用below正则表达式在输入量中出现前导零和逗号。例如,如果输入类似 我正在用 除了前导零之外,我无法替换可能存在的任何其他字符。例如,如果输入中已经存在“$”,则转换时会出现错误。我不知道该怎么办。

  • 问题内容: 我有一个字符串: 我要删除paren内部和paren本身中的所有内容,仅保留: 我试图用正则表达式来做到这一点,但是我的困难在于这种模式: 当我使用它时,它总是给我一个。如何修复我的正则表达式? 问题答案: 由于括号是正则表达式中的特殊字符,因此您需要对其进行转义以明确匹配它们。 例如:

  • 问题内容: 我正在尝试替换文件列表中的部分文件扩展名。我希望能够遍历项目(文件)并删除扩展名。我不知道当re.sub作为第三个参数需要一个字符串时,如何适当地遍历列表中的项目。例如。re.sub(pattern,repl,string,count = 0,标志= 0) 这里出现的问题是re.sub需要一个字符串,而我希望它在字符串列表中循环。 感谢您的任何建议! 问题答案: 您可以使用列表推导来使

  • 我的应用程序将userdata.dll的路径存储在字符串中。 我需要转换这个字符串: 转换为: 所有的< code>\都需要复制,这与路径有多少个< code>\无关。 像这样: 对此有任何帮助吗?我正在尝试遵循这个问题: 如何用VB.NET替换这根弦的一部分? 但无法找到如何制作这个Regex。。。

  • 我想使用Gson将字符串转换为Foo对象: 下面是我的正则表达式: 如何使用此正则表达式将所有,.和替换为,,而不更改JSON中的键和值?