質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

5回答

1345閲覧

Javaメソッド

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/05/10 08:52

引数で指定した数だけ草を生やして文字列として返す関数 kusa を作成する
以下のコードをもっと素直に書く方法としてはどんなものがあるのか知りたいです
よろしくお願いします

Java

1public class W_Unavoidable { 2 public static void main(String[] args) { 3 String w = kusa(50); 4 System.out.println(w); 5 } 6 public static String kusa(int num){ 7 String grass = ""; 8 for(; num > 0; num--){ 9 grass = grass + "w"; 10 } 11 return grass; 12 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

java

1public class Main { 2 public static void main(String[] args) throws Exception { 3 System.out.println(kusa(50)); 4 } 5 6 public static String kusa(int n){ 7 if (n < 1) return ""; 8 return "w" + kusa(--n); 9 } 10}

計算量やメモリやスタックのことなんかは知りません。
コードが美しければよいのですw

投稿2017/05/10 11:24

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

標準ライブラリだけでの実装を6個ほど考えました。

Java

1/** StringBuilder版 2 * 高速なStringBuliderに対して文字を追加する。 3 * 初期のキャパシティをnumにしておくと良いような気がする。 4 */ 5public static String kusa1(int num){ 6 StringBuilder grass = new StringBuilder(num); 7 for (int i = 0; i < num; i++) { 8 grass.append("w"); 9 } 10 return grass.toString(); 11} 12 13/** StringBuilder + 2倍しながら追加版 14 * 高速なStringBuliderに追加する。 15 * 2倍しながら追加していくので、O(n)=>O(log n)になるはず。 16 */ 17public static String kusa2(int num){ 18 StringBuilder grass = new StringBuilder(num); 19 String w = "w"; 20 while (num > 0) { 21 if ((num & 1) == 1) { 22 grass.append(w); 23 } 24 w += w; 25 num >>= 1; 26 } 27 return grass.toString(); 28} 29 30/** char[]版 31 * charの配列で作ってからStringにする。 32 */ 33public static String kusa3(int num){ 34 char[] grass = new char[num]; 35 for (int i = 0; i < num; i++) { 36 grass[i] = 'w'; 37 } 38 return new String(grass); 39} 40 41/** char[] + Arrays.fill版 42* charの配列で作ってからStringにする。 43 * Arrays.fillで埋める。 44 */ 45public static String kusa4(int num){ 46 char[] grass = new char[num]; 47 java.util.Arrays.fill(grass, 'w'); 48 return new String(grass); 49} 50 51/** IntStream版 52 * なんとなくIntSteramを使いたかっただけ。 53 */ 54public static String kusa5(int num){ 55 StringBuilder grass = new StringBuilder(num); 56 java.util.stream.IntStream.range(0, num).forEach((i) -> { 57 grass.append("w"); 58 }); 59 return grass.toString(); 60} 61 62/** IntStream + collect版 63 * なんとなくIntSteramを使いたかっただけ、その2。 64 * collectを使ってみたけど、面倒。parallelにすると壊れそう。 65 */ 66public static String kusa6(int num){ 67 return java.util.stream.IntStream.range(0, num).collect( 68 () -> new StringBuilder(), 69 (grass, i) -> grass.append("w"), 70 (a, b) -> a.append(b.toString()) 71 ).toString(); 72}

Stringに+するよりStringBuiderにappend()した方が高速です。kusa1にするだけでもかなり違うと思います。StringBuilder.appendが定量計算時間なら、kusa2が一番速くなりそうですが、kusa4あたりが最速のような気がします。二文字以上だとkusa3kusa4は使えませんが、一番素直なやり方かかも知れません。kusa5kusa6は、まぁ、IntStreamを使いたかっただけかと。

投稿2017/05/10 10:49

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/05/10 12:25

Stream.generateからlimitは…?
raccy

2017/05/10 12:34

うーん、それならIntStreamを'w'だけのストリームにしてappendCodePointかなー
退会済みユーザー

退会済みユーザー

2017/05/10 12:54

ありがとうございます!参考にさせていただきます!
swordone

2017/05/10 18:19

連結する文字数を10000000にして、実際にかかる時間を計測してみました。 kusa3とkusa4は15ms前後、他は3桁msかかります。 速くなりそうというkusa2は、連結する文字列を倍々にするための連結にString生成をしているため、余計な時間がかかるのだと思われます。 kusa1はappendの引数を"w"ではなく'w'にすると、70ms前後になりました。
guest

0

java

1public class W_Unavoidable { 2 public static void main(String[] args) { 3 kusa(50); 4 } 5 public static void kusa(int num){ 6 for(int i = 0;i<num ; i++){ 7 System.out.print("w"); 8 } 9 } 10}

あえてforを使っていくスタイル マイナスが素直じゃない感じなので。

投稿2017/05/10 09:10

toutou

総合スコア2050

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2017/05/10 09:58

kusaは「文字列として返す関数」なので、出力してしまってはだめなのでは?
toutou

2017/05/10 10:06

あ、ほんとだ。printは確認用か。条件だけ変更ってことで。
退会済みユーザー

退会済みユーザー

2017/05/10 12:54

ありがとうございます!参考になりました
guest

0

StringUtils.repeatメソッドでできそうですね。

投稿2017/05/10 08:57

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/05/10 12:55

ありがとうございます!参考にします
guest

0

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html
のStringUtilsを使ってよいのならすごいスッキリかけます。

java

1public static String kusa(int num){ 2 return StringUtils.repeat("w", num); 3}

投稿2017/05/10 08:58

TakeoAsai

総合スコア880

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問