【问题标题】:Convert string to reverse int array将字符串转换为反向整数数组
【发布时间】:2019-06-17 06:58:46
【问题描述】:

我想优化这个解决方案(惯用的)。

我有一个只包含整数值的字符串。我想将此字符串转换为反向 int 数组。输出应该是一个整数数组

这是我的解决方案:

private static int[] stringToReversedIntArray(String num) {
    int[] a = new int[num.length()];
    for (int i = 0; i < num.length(); i++) {
        a[i] = Integer.parseInt(num.substring(i, i + 1));
    }
    a = reverse(a);
    return a;
}

/*
 * Reverses an int array
 */
private static int[] reverse(int[] myArray) {
    int[] reversed = new int[myArray.length];
    for (int i = 0; i < myArray.length; i++) {
        reversed[i] = myArray[myArray.length - (i + 1)];
    }
    return reversed;
}

Input: "1256346258"
Output: {8,5,2,6,4,3,6,5,2,1}

请建议如何做。

【问题讨论】:

  • 您尝试过哪些“标准库方法调用”?你有没有做过任何研究来看看有什么可用的?
  • 在您解码原始字符串的同时反转:a[num.length()-i-1] = num.charAt(i)-'0';
  • 这个问题似乎有一个由 OP 提供的解决方案。它可能更适合 codereview.stackexchange.com。

标签: java arrays string


【解决方案1】:
var input = "1256346258";
var result = Arrays
        .stream(new StringBuffer(input).reverse().toString().split(""))
        .map(Integer::parseInt)
        .collect(Collectors.toList());
System.out.println(result);

【讨论】:

  • StringBuffer → StringBuilder
  • @ZhekaKozlov StringBuilder 可以替换为不需要同步的 StringBuffer,就像讨论过的here
  • 可以,但不应该
【解决方案2】:

由于您一次提取一个字符,因此使用charAt 而不是substring 更有意义。

由于您要将单个字符转换为int,因此Character.getNumericValue()parseInt 更有意义。

所以我会改变

a[i] = Integer.parseInt(num.substring(i, i + 1));

a[i] = Character.getNumericValue(num.charAt(i));

如果您不介意使用Integer[] 而不是int[],也可以将反向部分简化如下:

private static Integer[] stringToReversedIntArray(String num) {
    Integer[] a = new Integer[num.length()];
    for (int i = 0; i < num.length(); i++) {
        a[i] = Character.getNumericValue(num.charAt(i));
    }
    Collections.reverse(Arrays.asList(a));
    return a;
}

【讨论】:

  • 关于getNumericValue的小记。如果你传递字母字符,它会输出奇怪的数值,而parseInt() 更安全一些,会抛出NumberFormatException。当然,每个都有自己的方便方式。
  • @jbx 好吧,OP 确实说 string containing only integer values
  • 是的,当然,该解决方案是完全有效的。只是为希望使用此选项的未来读者提供了注释。因为很容易忽略这种细微的差别。
【解决方案3】:

单线:

return IntStream
    .range(0, num.length())
    .map(i -> Character.getNumericValue(num.charAt(num.length() - i - 1)))
    .toArray();

【讨论】:

    【解决方案4】:

    不需要循环2次,你可以使用StringBuilder来反转一个String,然后循环遍历它以将结果存储到你的int数组中:

      private static int[] stringToReversedIntArray(String num) {
        num = new StringBuilder(num).reverse().toString();
        int[] result = new int[num.length()]; 
        for (int i = 0; i < result.length; i++){
          result[i] = Character.getNumericValue(num.charAt(i)); 
        }
        return result;
      }
    

    其他选项要么只是反转你的 for 循环并让它倒数:

    for(int i = array.length - 1; i >= 0; i--){
      ...
    }
    

    或者在最近的 Java 版本中使用 Stream API,正如上面已经提到的一个很好的例子。

    【讨论】:

      【解决方案5】:

      如果你想使用流,你可以这样做:

      Deque<String> deque = num.chars()
         .map(c -> Character.toString((char) c))
         .map(Integer::parseInt)
         .collect(Collector.of(
              ArrayDeque::new,
              (stack, i) -> stack.addFirst(i),
              (s1, s2) -> { s2.addAll(s1); return s2; })); //this combiner won't really be called unless the stream was parallel
      
      Integer[] reversed = deque.toArray(new Integer[deque.size()]);
      

      这只会在列表中循环一次。 Deque 可以作为堆栈,后进先出,因此每个addFirst() 将自动反转顺序,因为它将每个项目添加到列表的前面而不是后面。之后您可以将其转换为数组,或者按原样使用Deque,这是一个普通的Collection,并实现了Iterable

      正如其他答案所提到的,如果您 100% 确定只有数字,您也可以像这样简化它,因为使用简化版本您不会得到 NumberFormatException

      Deque<String> deque = num.chars()
         .map(c -> Character.getNumericValue((char) c))
         .collect(Collector.of(
              ArrayDeque::new,
              (stack, i) -> stack.addFirst(i),
              (s1, s2) -> { s2.addAll(s1); return s2; }));
      
      Integer[] reversed = deque.toArray(new Integer[deque.size()]);
      

      【讨论】:

        【解决方案6】:
        String str = "123456";
        // Reverse String
        str = new StringBuilder(str).reverse().toString();
        String strArr[] = str.split("(?!^)");
        // Convert to Int Array
        int[] intarray = java.util.Arrays.stream(strings).mapToInt(Integer::parseInt).toArray();
        

        【讨论】:

          【解决方案7】:

          Erans 解决方案对我来说很好,但我不喜欢 for 循环,如果可能的话我更喜欢流 api

          String testString = "1256346258";
          IntStream intStream = testString.chars();       
          List<Integer> x = intStream.boxed().collect(Collectors.toList());
          Collections.reverse(x);
          int[] array = x.stream().mapToInt(i -> Character.getNumericValue(i)).toArray();
          System.out.println("x: " + Arrays.toString(array));
          

          用一个不错的方法包装它...

          【讨论】:

            【解决方案8】:

            这是一个带有单个 for 循环的简单解决方案。您可以在提取数值的同时“反转”数字,只需对索引进行一点操作:

            private static int[] stringToReversedIntArray(String num) {
                int len = num.length();
                int[] a = new int[len];
                for (int i = 0; i < len; i++) {
                    a[i] = Character.getNumericValue(num.charAt(len - i - 1));
                }
                return a;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-04-21
              相关资源
              最近更新 更多