Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—转换字符串中字符的最佳方法(数组,如果是,则为哈希映射)?_Java_Arrays_String - Fatal编程技术网

Java—转换字符串中字符的最佳方法(数组,如果是,则为哈希映射)?

Java—转换字符串中字符的最佳方法(数组,如果是,则为哈希映射)?,java,arrays,string,Java,Arrays,String,标题:(Java初学者)-在Java中,建议用什么方法替换字符串中的一系列字符 问题/示例:我希望将一组字符串中的某些字符替换为其他字符。(例如,所有“a”将替换为“aa”和“all”あ' 字符将替换为“a”) 数据示例: 塔米,Tあ嗯,约翰·琼斯·科德·马奇达,德拉尔,あい 改为: 塔米,塔米,约翰·约翰·科德姆あ奇达,德拉尔,一个い 我使用if-then语句来实现这一点,但这是不可伸缩的,因为可能要执行数百个if-then。我目前只是担心逻辑,还没有想到如何处理数据源文件,它将是csv文件

标题:(Java初学者)-在Java中,建议用什么方法替换字符串中的一系列字符

问题/示例:我希望将一组字符串中的某些字符替换为其他字符。(例如,所有“a”将替换为“aa”和“all”あ' 字符将替换为“a”)

数据示例: 塔米,Tあ嗯,约翰·琼斯·科德·马奇达,德拉尔,あい

改为: 塔米,塔米,约翰·约翰·科德姆あ奇达,德拉尔,一个い

我使用if-then语句来实现这一点,但这是不可伸缩的,因为可能要执行数百个if-then。我目前只是担心逻辑,还没有想到如何处理数据源文件,它将是csv文件或平面文件格式

问题:我应该看看阵列吗?哈希映射?收藏

当前代码类似于下面的代码,但我知道它效率低下。我想知道如何才能更有效地完成这项工作

public static String formatString(String s) 
{

        //Declare Variables
        String strInput = s;
        String strChanged = "";

        //Iterate through length of string
        for (int i = 0; i < strInput.length(); i++)
        {
          if (strInput.charAt(i)=='あ')
          {
              strChanged = strChanged + "a";    
          }
          else if (strInput.charAt(i)=='a')
          {
              strChanged = strChanged + "aa";
          }
          else if (strInput.charAt(i)=='c')
          {
              strChanged = strChanged + "k";
          }
          else
          {
              strChanged = strChanged + strInput.charAt(i);
          }
        }
        System.out.println(strChanged);
}            
公共静态字符串格式字符串(字符串s)
{
//声明变量
字符串strInput=s;
字符串strChanged=“”;
//遍历字符串的长度
对于(int i=0;i
注意事项: -最多200个需要更改的不同字符
-通过可能数千行的数据循环

您是否检查了?String.replace()和friends应该在一次或两次循环中执行您想要的操作。

这里有一个解决方案,使用
HashMap
来减少if语句的数量

String input = "Tammy,Tあmmy,John Jones KO'd Machida,The Drall,あい";
StringBuilder builder = new StringBuilder();
Map<Character, CharSequence> map = new HashMap<>();
map.put('あ', "a");
map.put('a', "aa");
map.put('c', "k");

for (char c : input.toCharArray()) {
    if (map.containsKey(c)) {
        builder.append(map.get(c));
    } else {
        builder.append(c);
    }
}

System.out.println(builder.toString());
String input=“Tammy,Tあ嗯,约翰·琼斯·科德·马奇达,德拉尔,あい";
StringBuilder=新的StringBuilder();
Map Map=newhashmap();
地图あ', "a”);
地图放置('a','aa');
map.put('c','k');
for(char c:input.toCharArray()){
if(图c){
builder.append(map.get(c));
}否则{
附加(c);
}
}
System.out.println(builder.toString());

有几种解决方案:

使用方法的另一种方式可能是使用
switch
语句

    for (int i = 0; i < strInput.length(); i++)
    {
      cur = strInput.charAt(i)
      switch (cur){
          case 'あ': ... 
              break;
          case 'a': ...   
              break;
          case 'c': ...    
              break;
          ...
    }
    System.out.println(strChanged);
for(int i=0;i
Switch语句通常是长if/else序列的一个很好的替代方案。请阅读以下内容:


更具可读性的解决方案是针对每种情况使用
String.replaceAll()
方法。这种方法的缺点是运行时会比较慢。一千行足够小,不会产生显著的差异,但重要的是要记住这些限制。此外,如果替换あ' 使用“a”然后使用“a”和“aa”,可能会意外得到错误的结果。编写测试!

String.replace效率非常低。要提高性能,请参阅Peter Lawrey对的回答,我将使用带查找表的正则表达式。正则表达式(仅匹配应更改的字符)可以从查找数据生成,该数据本身创建为一个简单的数据结构-代码本身不包含数据。要替换的输入是否始终为单个字符?您确定这些“字符”没有分解?您是在一个受约束的环境中运行的,在这个环境中,较大的查找表是不可行的吗?这是一个正确的答案。我将使用StringBuffer编写一个替代方案。@JadieldeArmas为什么要使用
StringBuffer
?这里绝对不需要
StringBuffer
?为什么不可能o使用它吗?可以使用
StringBuffer
,但在这种情况下,我完全看不到
StringBuffer
带来的同步需要。它在一个方法中,构建器/缓冲区不共享。您会损失性能。请看。@yate,非常感谢您的解决方案。这对您帮助很大。BTW,我知道这可能是一个子主题,但我想知道是否有任何地方可以看到Hasmaps与if-then迭代与replace语句对性能的影响?只是好奇而已