【问题标题】:How to match the chars of a string to the index of an array如何将字符串的字符与数组的索引匹配
【发布时间】:2019-01-05 06:51:01
【问题描述】:

我有一个由数字组成的字符串,我想将其与单词数组的内容相匹配。

输入字符串中的每个字符都与单词数组中的位置匹配。

如果我在if 语句之前打印出ij 的值,它们是正确的,0 and 03 and 3 等。但是下面的循环永远不会进入if 语句。请帮助我理解原因。

String input = "0356";
String[] words = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
String[] result = new String[4];

for (int i = 0; i < input.length(); i++) {
    for (int j = 0; j < words.length; j++) {
        if (Character.toString(input.charAt(i)) == Integer.toString(j)) {
            result[i] = words[j];
        }   
    }
}

我正在寻找的结果:

result[] = {"zero","three","five","six"}

【问题讨论】:

  • 字符串比较应始终使用equals()
  • Character.toString(input.charAt(i)).equals(Integer.toString(j))

标签: java arrays string loops char


【解决方案1】:

比较String时,需要使用equals()而不是==

所以改变

if (Character.toString(input.charAt(i)) == Integer.toString(j))

if (Character.toString(input.charAt(i)).equals(Integer.toString(j)))

【讨论】:

  • 只有一件事 Integer.toString() 在内部调用 new 时总是会创建 String 实例,例如,如果输入字符串长度为 20,则 20*10 = 200 的 String 实例将由这个解决方案。无论如何,为 OP 要求的解决方案 +1。
  • @AmanChhabra 你会建议什么来代替 Integer.toString,以避免创建所有新的 String 实例?
  • @DevStep 在上述情况下,将调用两个新字符串实例,一个由 Character.toString 和 Integer.toString 调用,我建议按照下面我的回答中的建议进行整数比较:stackoverflow.com/a/51569979/1262248
【解决方案2】:

你可以直接把它转换成整数,而不是用字符串玩。

 if (Integer.parseInt(String.valueOf(input.charAt(i))) == j)

输出:

jshell>     for (int i = 0; i < input.length(); i++) {
   ...>         for (int j = 0; j < words.length; j++) {
   ...>             if (Integer.parseInt(String.valueOf(input.charAt(i))) == j)
   ...>    {
   ...>                 result[i] = words[j];
   ...>             }   
   ...>         }
   ...>     }

jshell> System.out.println(Arrays.toString(result));
[zero, three, five, six]

PS:您需要注意的一件事是 parseInt 抛出 NumberFormatException,因此请确保您的输入字符串始终 有数字(也许你可以通过正则表达式验证它)或处理 异常正确

【讨论】:

    【解决方案3】:

    Java 8 流的替代方案可能是:

    import java.util.Arrays;
    
    public class numberToWords {
    
        public static void main(String args[]) {
            String input = "0356";
            String[] words = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };
    
            String[] result = Arrays.stream( // Convert to stream
                    input.split("")) // split each number
                    .map(e -> words[Integer.valueOf(e)]) // map each number to the corresponding word index
                    .toArray(String[]::new); // return the resulting array
    
            for (String string : result) {
                System.out.println(string);
            }
        }
    }
    

    导致:

    zero
    three
    five
    six
    

    【讨论】:

      猜你喜欢
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 2021-08-08
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多