将字符串转换成反向整数数组

5

我希望对这个解决方案进行优化(用惯用语)。

我有一个仅包含整数值的字符串。我想将这个字符串转换为反向 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}

请建议如何做到相同。

你尝试过哪些“标准库方法调用”?你有没有做过任何研究来了解可用的内容? - Jason
2
同时反转并解码原始字符串:a[num.length()-i-1] = num.charAt(i)-'0'; - Jean-Baptiste Yunès
1
这个问题似乎已经有 OP 提供的可行解决方案了。将其转到 codereview.stackexchange.com 可能更合适。 - MC Emperor
8个回答

3
var input = "1256346258";
var result = Arrays
        .stream(new StringBuffer(input).reverse().toString().split(""))
        .map(Integer::parseInt)
        .collect(Collectors.toList());
System.out.println(result);

1
StringBuffer → StringBuilder - ZhekaKozlov
@ZhekaKozlov 如果不需要同步,可以使用StringBuffer替换StringBuilder,就像这里讨论的那样:[https://dev59.com/dnRC5IYBdhLWcg3wROzk]。 - Rodolfo Martins
它可能是,但不应该这样。 - ZhekaKozlov

2

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

并且由于您正在将单个字符转换为int,所以使用Character.getNumericValue()parseInt更合理。

因此我会做出以下更改:

"最初的回答"

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

to

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
@jbx 嗯,OP 确实说了“仅包含整数值的字符串”。 - Eran
当然,这个解决方案是完全有效的。只是为了未来想使用此选项的读者增加了注释。因为很容易忽略这个细微差别。 - jbx

0
如果你想使用流,可以像这样做:
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

正如其他答案所提到的,如果您确信只有数字,也可以简化代码,因为使用简化版本不会出现 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()]);

0
不需要循环2次,您可以使用 StringBuilder 来反转字符串,然后在其上循环以将结果存储在整数数组中:
  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,正如上面已经提到的一个很好的例子。

0
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();

0

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));

只需用一个好的方法包装它...


0

这里有一个通过单一循环实现的简单解决方案。您可以在提取数值的同时,通过玩弄一下索引来“反转”数字:

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;
}

0

一行代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接