(Java)将符号字符串转换为一位数整数数组

(Java)将符号字符串转换为一位数整数数组,java,parsing,processing,Java,Parsing,Processing,我正在尝试获取一个字符串,即$#,将每个单独的符号转换为其相应的ASCII值,此处为36、33、35,然后以整数数组结束,每个整数存储在单独的索引中,表示3、6、3、3、3、5 简而言之:从$开始#至$#至36,33,35至3,6,3,3,5 因为我使用的是Processing(Java包装器),所以我的SO研究让我至今: String str = "$!#"; byte[] b = str.getBytes(); for (int i=0; i<b.length; i++){ pri

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

简而言之:从
$开始#
$#
36,33,35
3,6,3,3,5

因为我使用的是Processing(Java包装器),所以我的SO研究让我至今:

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

for (int i=0; i<b.length; i++){
 println(b[i]); 
}
String str=“$!#”;
字节[]b=str.getBytes();

对于(int i=0;i老实说,如果我是你,在你遇到实际问题之前,我不会太担心“效率”。编写你理解的代码。如果你对效率有问题,你必须准确定义你的意思:它需要太多步骤吗?它需要太长时间吗?输入的大小是多少

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

如果你在O(N)中有一个特定的瓶颈,那么你应该做一些分析来找出瓶颈在哪里。但是你不应该因为你“感觉”某些东西“效率低下”而费心于微优化(或不寒而栗的过早优化)

引自:

…在没有衡量性能问题的情况下,您不应该进行优化,因为您认为您将获得性能增益

如果我是你,我只需要使用
charAt()
函数获取
String
中的每个
char
,然后使用
int()
函数将该
char
转换为
int
。然后可以将这些
int
值添加到
字符串中(最好是一个
StringBuilder
):

印刷品:

3
6
3
3
3
5

有很多不同的方法可以做到这一点:例如,您可以使用
tocharray()
函数而不是
charAt()
。但是,在您准确定义效率之前,所有这些都不会有多少“效率”。

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)
}
//创建一个大小为3*str.length()的int数组
对于(int i=0;i

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

你可以只处理每个字符,例如,
$
->
36
->
3,6
你确定没有输入字符的ASCII值>99吗?你说它效率低下是什么意思?你如何定义ng效率?是什么让你认为你的性能很差?你的
字符串
值有多大?这段代码运行在什么上下文中?@Kevin:我的意思是尽可能少的数据类型转换,因为我不确定。@rkosegi:我对我的项目的概念证明0-99表示满意。但这是进一步改进的一个明显点。他说希望它是一个
int[]
数组,例如
3,6,3,3,3,5
,而不是
36,33,35
“这些方法都是O(N),这可能是您将获得的最佳方法。”。很明显,你没有比这更好的了。你毕竟必须至少看一次每个角色。@Voo-Yep,没错。非常感谢凯文,这解决了我的问题。我所说的效率是指更少的“步骤”关于转换。由于我对编程的知识不多,我不确定我是否把事情过度复杂化了。这在刚开始编程时似乎是次要的,但我尊重一个优雅的解决方案,并试图从中学习。但你是对的,我应该在过早优化方法之前专注于解决问题。@pmish没有问题。这是正确的可能会很容易挂断寻找“最好的”解决方案,但95%的编程只是完成并继续。也就是说,对于100个字符的
字符串
所采用的方法可能与对于万亿个字符的
字符串
所采用的方法不同。但是,由于您的上下文可能更接近
100
标记,因此通常使用simplest解决方案(因此最容易理解)是最好的选择。请注意,这是一个问题,处理不支持Java 8。此外,这是比OP的解决方案“更高效”,还是只是将O(N)隐藏在流API中?我并不是说你的问题是错的(事实上,我总是喜欢看到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)
}