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

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

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

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

Q&A

5回答

1813閲覧

Javaでコードを短くする技

boobooboo

総合スコア12

Java

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

1グッド

0クリップ

投稿2019/04/03 08:35

初心者の質問ですが、javaで課題提出したら、コードが長いというのと、for文とかlist使って凡庸的に仕上げなさいと言われたんですが、それってけっこう難しくないですか? また何かいい本はありますか? よろしくお願いします。

sansaisoba👍を押しています

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

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

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

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

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

cateye

2019/04/03 08:45 編集

質問は編集できるので、<code>を選んでその中に「長いコード」を貼り付けてください。
mutsuki22

2019/04/03 08:48

<code>の提示をして頂かないと、なんとも言えないですね。 難しいかどうかも書かれたコード次第かと思います。
m.ts10806

2019/04/03 08:59

まず、やってみては。 実際に取り組んだかどうかもこれでは分かりません
swordone

2019/04/03 11:27

×凡庸的(ぼんようてき) 〇汎用的(はんようてき)
otn

2019/04/03 12:05

指示が「凡庸的」なら、そのままのコードで良いと思う。
退会済みユーザー

退会済みユーザー

2019/04/03 13:52

ぱっとみありがちな int a1 = scn.nextInt(); int a2 = scn.nextInt(); int a3 = scn.nextInt(); : とかやって怒られてるんだろうなぁ
guest

回答5

0

恐らく, 繰り返しで書けるモノを全部展開した状態にしたものと想像します.

// 例) 1~100の合計値を表示 // 繰り返し: 5行 int sum = 0; for(int i=1; i<=100; i++) { sum += i; } System.out.println("sum="+sum); // 全部並べた: 102行 int sum = 0; sum = sum + 1; sum = sum + 2; sum = sum + 3; sum = sum + 4; //(中略) sum = sum + 97; sum = sum + 98; sum = sum + 99; sum = sum + 100; System.out.println("sum="+sum);

ですので, 繰り返しで書けば短くなり, 理解している者には難しくないことだろうと推測します.

for や list を習っているからこそ指摘されたものと思いますので, 復習されれば良いかと思います.

投稿2019/04/03 09:17

編集2019/04/03 09:43
jimbe

総合スコア12646

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

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

0

Javaは普段書かないのと質問に具体的なコードが示されていないため具体的な回答は書けませんが、
プログラミング全般における一般論として回答します。

まず、「コードを長いと言われた」点について、「コードを短く」するいうことについてお話します。

「コードを短くする」というのは単純に文字数を減らすという意味合いではありません。

コードゴルフと呼ばれる競技プログラミングにおいては、以下に少ない文字数で機能を実装するかという目的で、
いろんなテクニックを使ってコードを短くしていきますが、
実用的なプログラミングにおいては、このようなテクニックを使うことはありません。

例として、以下の記事が見つかりましたので提示します。
Java で書いた FizzBuzz を短くしながら仕様について学ぶ - Qiita

こちらの記事には、コードをどんどん「短くしていく」過程が書かれていますが、
恐らく課題を出した方の意図としては、こういう意味合いで「コードが長い」と言ったことではないはずです。
まず、この点についてはご注意ください。
競技プログラミング的なコードを短くする技術は「とても難しい」です。

さて、本題の「コードが長い」についてですが、

for文とかlist使って凡庸的に

と言われたということですが、(…ちなみに「凡庸的」ではなく「汎用的」ですかね)
この内容から察するに、質問者様が提出されたコードは、

  • 同じ処理を複数回書いている
  • 似たような名前の変数がたくさんある
  • 複数回コピペした部分がある

というような状態になっていませんか?

プログラミングの原則にDRYと呼ばれるものがあります。
同じ処理をコピペしたのであれば、その処理は確実にループやモジュール化を行うなどしてまとめることができるはずです。

こういったテクニックはJavaだけに関わらずほぼ全てのプログラミングで必要になる手法ですので、身につけたほうがよいです。

…が、正直なところ、私自身どうやって身につけたのかは昔過ぎて既に覚えていません…。

ですので、難しいかどうかも判断できないのですが、
プログラマーとして活動している方は例外なく使うことができる技術ですので、
繰り返しプログラミングに触れていくことで自然と身につくものではないかと思っています。

つまり小さい子供が自転車に乗ることみたいなものですので、
難しいとも簡単とも言い難いなというのが率直な感想です。


というわけで、長文になりましたが、おすすめの本を書いておきます。

プリンシプル オブ プログラミング3年目までに身につけたい一生役立つ101の原理
https://www.amazon.co.jp/dp/4798046140/

具体的なコード例はあまり書いてない本ですが、一度目を通しておくことをお勧めします。

具体的なコードを短くする手法について知りたいのであれば、
とにかくいろんなコードを読み、自分で書くことです(単純な写経も結構良いです)。

その上で、もしわからないことが出たのでれば、
他の方も書いていらっしゃるように実際のコードを含めてご質問されたほうが良いでしょう。

頑張ってください。

投稿2019/04/03 09:40

sansaisoba

総合スコア241

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

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

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

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

0

「コードが長い」というのはおそらく もっと短く、簡潔に、そして効率的にコードを書こう ということだと思います.そのために同じような処理はfor文や配列でまとめたり,メソッドの部分に切り離したりします.

たとえば,0から9まで偶数の時"even", 奇数の時"odd"と表示するコードを書くとします。
(i)for文を使わずに書くと

java

1public class Main { 2 public static void main(String[] args) throws Exception { 3 4 System.out.println("0:even"); 5 System.out.println("1:odd"); 6 System.out.println("2:even"); 7 System.out.println("3:odd"); 8 System.out.println("4:even"); 9 System.out.println("5:odd"); 10 System.out.println("6:even"); 11 System.out.println("7:odd"); 12 System.out.println("8:even"); 13 System.out.println("9:odd"); 14 } 15}

となりますが,ご覧の通り コードは長いうえに非効率です。9までだったからよかったけれど
これが99までとかになると大変になるますよね?
このコードを簡潔にするためにfor文を使います

(ii)forを使ってとりあえず短くする

java

1public class Main { 2 public static void main(String[] args) throws Exception { 3 4 for(int i = 0; i < 10; i++){ 5 System.out.print(i + ":"); 6 if(i % 2 == 0){ 7 System.out.println("even"); 8 } 9 else{ 10 System.out.println("odd"); 11 } 12 } 13 } 14} 15

先ほどよりは簡潔になりました. これでもいいですが、ifを使わずに、もっと短く書くこともできます。
ここで、配列を使います。

java

1public class Main { 2 public static void main(String[] args) throws Exception { 3 4 String[] text = {"even","odd"}; 5 6 for(int i = 0; i < 10; i++){ 7 System.out.println(i + ":" + text[i % 2]); 8 } 9 } 10}

どうですか? 見た目 とても簡潔だと思いませんか?

このように同じ結果でも書いたコードによって可読性に差が出ます。
またif文は分岐がある分処理するときメモリを消費します。
if文を使わないことでメモリ消費も節約できます。

for文とかlist使って凡庸的に仕上げなさいと言われたんですが、それってけっこう難しくないですか?

.for文を使うとき、自分がやっていることを述べると

  • 規則性を見つけ一つにまとめる

例)1,4,9,16,25,36,49 ... -> 平方数だから (for文でループさせる変数i)^2

  • 2重for文などで変数が多くなりわかりづらいときは、紙に書いて地道に処理を追いかける。

自分で考え、理解することで自分のものになり 上達すると思います。

#最後に

プログラミングは頭で考えるのが80%, 実際にコードに落とし込むのが20%だといわれています。
またプログラミングは文法やコードをを覚える学問ではなく、理解する学問です。
最初は、理解し難い処理があるかもしれませんが、勉強していくと少しずつ分かってくると思います。

投稿2019/04/03 12:46

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

1 から 100 までを足し算したらいくつになるか?
という問題にはいくつかの方法があります。

  • 1 + 2 + 3 ... + 100 と 長い計算式を書く

  • for 構文をつかって繰り返し部分をまとめるように書く

  • 糖鎖数列の和の公式をつかって1つの式で書く

まずは java の構文を学ぶことで、コードを短く汎用的にできます、
次は、アルゴリズムを学ぶことです。

参考情報

  • ガウスの逸話

https://shuju.exblog.jp/14481870/

投稿2019/04/03 22:23

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問