我是Java的新手,正在寻找代码优化技术。这段代码使用两个for循环给出了预期的输出,我想减少/消除循环(如果可能的话)。
public static void main(String[] args) {
String dummy = "Hello how are you";
String[] strArr = dummy.split(" ");
for(int i=0; i < strArr.length;i++){
String word = strArr[i];
for(int j=word.length(); j > 0; j--){
System.out.print(word.charAt(j - 1));
}
System.out.print(" ");
}
}
输出: olleH woh era uoy
请建议。
答案 0 :(得分:5)
由于打印输出的复杂性将保持不变,您所能做的就是将循环“隐藏”到现有方法中,这些方法可以执行您想要的操作,而不是消除它们,因为系统需要执行的工作量仍然存在在需要处理的字符数方面也是如此。
您可以使用此Q&A中所述的字符串反转技术隐藏嵌套循环。外循环可以推入String.join
:
String[] data = {"quick", "brown", "fox"};
System.out.println(
String.join(
" "
, Arrays.stream(data)
.map(s -> new StringBuilder(s).reverse().toString())
.toArray(String[]::new)
)
);
答案 1 :(得分:1)
正如我在评论中所述,复杂性已经"Hello how are you"
"uoy era woh olleH"
"uoy" "era" "woh" "olleH"
"olleH" "woh" "era" "uoy"
,你无法改善,因为你需要阅读输入字符串。无论如何,有一种方法可以避免&#34;两个for循环:反转整个字符串,拆分空格,并反转生成的数组。
示例:
public static void main(String[] args) {
String dummy = "Hello how are you";
int n = dummy.length();
StringBuilder sb = new StringBuilder(n);
while (--n >= 0) sb.append(dummy.charAt(n));
String[] tokens = sb.toString().split(" ");
n = tokens.length;
while (--n >= 0) System.out.print(tokens[n] + " ");
}
代码:
add-migration
相反,如果您在冷却java 8 Stream技巧之后,请阅读dasblinkenlight's answer。
答案 2 :(得分:1)
这是另一个使用 StringTokenizer 的简单解决方案。
只需要O(n)。
$query = "INSERT INTO paypal_verification (acc_id, payment_id, state, amount)
SELECT acc_id, '$payment_id', '$state', '$amount' FROM account_details WHERE Username='$Username'";