<p>你用的太多了JsonObject.getString,通过使用它来检索非字符串数据。你知道吗</p>
<p>让我们从<code>coords</code>属性开始,因为它是一个更简单的情况。<code>[1,2,3]</code>不是字符串。这是一组数字。因此,应将其检索为数组:</p>
<pre><code>JsonArray coords = jsonObject.getJsonArray("coords");
int count = coords.size();
double[] uvw = new double[count];
for (int i = 0; i < count; i++) {
uvw[i] = coords.getJsonNumber(i).doubleValue();
}
</code></pre>
<p>另一个属性<code>data</code>也是一个数组,但包含字符串元素:</p>
<pre><code>JsonArray data = jsonObject.getJsonArray("data");
int count = data.size();
for (int i = 0; i < count; i++) {
String complexValuesStr = data.getString(i);
// ...
}
</code></pre>
<p>至于解析出复杂的数字,我不会把这些都做出来字符串.替换电话。相反,您可以使用正则表达式匹配器查找每个复杂值:</p>
<pre><code>Pattern complexNumberPattern = Pattern.compile(
"\\(\\s*" + // opening parenthesis
"(-?[0-9.]+)" + // group 1: match real part
"\\s*([-+])\\s*" + // group 2: match sign
"([0-9.]+)j" + // group 3: match imaginary part
"\\s*\\)"); // closing parenthesis
Matcher matcher = complexNumberPattern.matcher("");
JsonArray data = jsonObject.getJsonArray("data");
int count = data.size();
List<List<Complex>> allFrequencyValues = new ArrayList<>(count);
for (int i = 0; i < count; i++) {
String complexValuesStr = data.getString(i);
List<Complex> singleFrequencyValues = new ArrayList<>();
matcher.reset(complexValuesStr);
while (matcher.find()) {
double real = Double.parseDouble(matcher.group(1));
boolean positive = matcher.group(2).equals("+");
double imaginary = Double.parseDouble(matcher.group(3));
Complex value = new Complex(real, positive ? imaginary : -imaginary);
singleFrequencyValues.add(value);
}
allFrequencyValues.add(singleFrequencyValues);
}
</code></pre>
<p>不应捕获IndexOutOfBoundsException或NumberFormatException。这表明输入无效。您不应该将无效输入视为零;这意味着发送者犯了错误,您应该确保让他们知道这一点。例外是一个很好的方法。你知道吗</p>
<p>我假设这两个术语总是出现在每个复杂的表达式中。例如,2<em>i</em>将显示为<code>0 + 2j</code>,而不仅仅是<code>2j</code>。像5这样的实数将显示为<code>5 + 0j</code>。如果这不是一个安全的假设,解析就会变得更复杂。你知道吗</p>
<p>因为您关心性能,所以我可以尝试上面的方法;如果使用正则表达式使程序运行太慢,您可以通过单步遍历字符串来查找括号和术语。这将是更多的工作,但可能会提供一个速度增加。你知道吗</p>