我正在尝试使用一个字符串,即$!#
,将每个单独的符号转换为其对应的ASCII值,此处为36, 33, 35
,然后以每个单个数字的整数数组结束存储在单独的索引中,意思是3, 6, 3, 3, 3, 5
。
简而言之:从$!#
到$,!,#
到36, 33, 35
到3, 6, 3, 3, 3, 5
由于我正在使用Processing(Java的包装器),到目前为止,我的SO研究得到了我:
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
,然后将整个事物再次拆分成单个数字整数数组。
我想知道这种方法是否不必要地复杂化,并且可以通过较少的转换步骤来完成。有什么建议吗?
答案 0 :(得分:1)
老实说,如果我是你,我不会过分担心效率&#34;直到你遇到实际问题。编写您理解的代码。如果您对效率有疑问,您必须准确定义您的意思:它采取了太多步骤吗?这花了太长时间?输入的大小是多少?
请注意,您概述的方法和下面的方法都是O(N),这可能是您最好的。
如果你在O(N)中有一个特定的瓶颈,那么你应该做一些分析来找出它的位置。但是,你不应该仅仅因为你感觉到并且感觉不到微优化(或者颤抖过早优化)。喜欢的东西是效率低下的#34;。
引用this answer:
...在没有测量性能问题的情况下,您不应该进行优化,因为您认为您将获得性能提升。
如果我是你,我会使用charAt()
函数获取char
中的每个String
,然后使用int()
函数转换char
1}}成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()
。但这些都不会或多或少地变得有效&#34;直到你准确定义效率的含义。
答案 1 :(得分:0)
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]
答案 2 :(得分:0)
一种解决方案可能就是做那样的事情
// 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)
}
但正如其他人之前所说,我不确定是否值得这样玩。这取决于我的应用程序。