(Java) 将符号字符串转换为单个数字整数数组

(Java) Converting String of symbols to single digit integer array

我正在尝试获取一个字符串,即 $!#,将每个单独的符号转换为其相应的 ASCII 值,此处为 36, 33, 35,然后以每个整数数组结尾单个数字存储在单独的索引中,意思是 3, 6, 3, 3, 3, 5.

简而言之:从$!#$,!,#36, 33, 353, 6, 3, 3, 3, 5

因为我使用的是 Processing(Java 的包装器),所以我的 SO-research 使我到目前为止:

String str = "$!#";
byte[] b = str.getBytes();

for (int i=0; i<b.length; i++){
 println(b[i]); 
}

我以 ASCII 值结束。字节数组 b 包含 [36, 33, 35].

现在,如果那些是字符串而不是字节,我将使用 String.valueOf(b) 来获取 363335,然后将整个事物再次拆分为一个数字整数数组。

我想知道这种方法是否过于复杂并且可以通过更少的转换步骤来完成。有什么建议吗?

老实说,如果我是你,在你遇到实际问题之前我不会太担心 "efficiency"。编写您理解的代码。如果您对效率有疑问,则必须准确定义您的意思:是否需要太多步骤?是不是时间太长了?您输入的尺寸是多少?

请注意,您概述的方法和下面的方法都是 O(N),这可能是您将获得的最佳方法。

如果您在 O(N) 内有特定的瓶颈,那么您应该进行一些分析以找出瓶颈在哪里。但是你不应该因为你 "feel" 喜欢的东西是 "inefficient".

而进行微优化(或 shudder 过早的优化)

引用自this answer

...in the absence of measured performance issues you shouldn't optimize because you think you will get a performance gain.

如果我是你,我会直接使用charAt()函数获取String中的每个char,然后使用int()函数将其转换char 变成 int。然后你可以将这些 int 值添加到 String(或者更好的是 StringBuilder):

String str = "$!#";

StringBuilder digits = new StringBuilder();
for (int i=0; i<str.length(); i++) {
  int c = int(str.charAt(i));
  digits.append(c);
}

然后你可以使用split()函数将它们拆分成单独的数字:

String[] digitArray = digits.toString().split("");
for (String d : digitArray) {
  println(d);
}

打印:

3
6
3
3
3
5

有很多不同的方法可以做到这一点:例如,您可以使用 toCharArray() 函数而不是 charAt()。但是 none 这将或多或少 "efficient" 直到你准确定义你所说的效率。

Java 8流解决方案:

int[] digits = "$!#".chars()
                    .mapToObj(Integer::toString)
                    .flatMapToInt(CharSequence::chars)
                    .map(c -> c - '0')
                    .toArray();
System.out.println(Arrays.toString(digits)); // prints [3, 6, 3, 3, 3, 5]

一个解决方案可能是做类似的事情

// Create an array of int of a size 3 * str.length()

for(int i = 0; i < str.length(); i++)
{
  int n = (int) str.charAt(i);
  int a = n / 100;
  int b = (n - (a * 100)) / 10;
  int c = n - (a * 100) - (b * 10);

  // push a, b and c in your array (chose the order and if you want
  // to add the potential 0's or not)
}

但正如其他人之前所说,我不确定是否值得那样玩。我想这取决于你的应用程序。