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

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

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

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

Q&A

解決済

4回答

1495閲覧

条件分岐 簡潔に書きたい

cuku

総合スコア108

Java

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

0グッド

0クリップ

投稿2019/01/11 08:21

ファイル➀とファイル➁というボタンがありファイル➀を押した時にはファイル➀が出力されファイル➁を押下した時にはファイル➁が出力される処理があります。
ユーザーごとに出力するファイルのパスが違います。
この条件の分岐方法を簡潔に書きたいのですがいい書き方が思いつきません。
今後ユーザーが追加される可能性があるのでswitch caseを使って書こうと思ったのですが
ファイル➀とファイル➁で分けてからユーザーごとに分けるとするとコードがかなり見にくくなってしまいました。言語はJavaを使っています。
複雑な条件分岐でも簡潔に書ける方法がありましたら教えてもらいたいです
・ユーザーごとに出力するフィルを分ける
・出力するファイルは二種類
・今後ユーザーが増える可能性がある。

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

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

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

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

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

m.ts10806

2019/01/11 08:24

実際のコードを提示されたほうが良いかと思います。 でないと添削もできませんし、文章だけでは伝わらないことも多いです
azuapricot

2019/01/11 08:26

コードが見にくくなったということはコードを書いているとおもうので、 マークダウン機能をつかって質問に追記してください → <code> ってやつです
cateye

2019/01/11 08:31

>ユーザーごとに出力するファイルのパスが違います・・・これは、すべてのユーザのパス(2つとも)が違うということですか?
cuku

2019/01/11 08:33

cateyeさん> はい!すべてのユーザーのパス二つとも違います
cateye

2019/01/11 08:45

ユーザ名とかIDとかをキーして、map検討してみたらどうでしょう?
cuku

2019/01/11 08:49

mapで条件分岐ってできますか?
cateye

2019/01/11 08:55

いや、キーをもとにパスを持ってくるだけです。
cuku

2019/01/11 08:57

先に条件分岐をしないと無理なような気がするんですが
cuku

2019/01/11 09:05

あります
cuku

2019/01/11 09:06

ファイル①とファイル②の条件分岐はどうするのでしょうか?
cateye

2019/01/11 09:08

mapから引っ張ってくるときに、1番目か2番目かの判断をすればいいだけです。
cuku

2019/01/11 09:20

あーなるほど。 ありがとうございます。やってみます。 一番か二番かってどうやってはんだんすればいいのですか?
cateye

2019/01/11 09:35 編集

それはパスのもたせ方次第ですが、通常1番のボタンが押されたら1番目ということでしょうね。
guest

回答4

0

ベストアンサー

ファイルを作る処理と出力する処理を分けると簡潔にできます。

以下は、イメージです。

java

1 2main(){ 3 File downLoadFile; 4 5 //ファイル作成処理 6 if(isClickButton1 == true) 7 { 8 downLoadFile = createFile1(); 9 } 10 else 11 { 12 downLoadFile = createFile2(); 13 } 14 15 // 1行で書きたければこちら(上とやっていることは同じ) 16 File downLoadFile = (isClickButton == true) ? createFile1() : createFile2(); 17 18 // ファイル出力 19 outputFile(usercode,downLoadFile); 20 21} 22 23File createFile1() 24{ 25 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 26} 27 28File createFile2() 29{ 30 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 31} 32 33 34void outputFile(string usercode) 35{ 36 XXXXXXXXXXXXXXXXXXXXXXXXXXXXX 37} 38

ファイルの出力先がユーザーごとに違う件の解決策は、2種類あります。
①出力先のルールをきっちり決める
例えば、ユーザーごとにフォルダを分ける
\server\output\usercode
機能ごとに分けるとか
\server\output\button1\usercode
\server\output\button2\usercode
\server\output\usercode\button1
\server\output\usercode\button2

②DBに出力先を持たせる
自由に出力先を変えたい。という要望があればです。
テーブルの定義は下記になると思います。
すでにアカウントマスタを持っていれば、列を追加してください。
usercode、outputPath

少なくとも、Case文で。。。というのは止めておきましょう。。。
ユーザーが追加になった時にすぐに対応できないです。
時間がかかると説明しても、ユーザーは納得しないです。
なぜ、出力先を追加するだけで時間がかかるんだ。となります。

追記:
DBに出力先の列を追加するときは、編集、登録画面もセットで開発することを勧めます。
システム管理者でDBに直接更新をかけることはミスの元です。
作業負荷も増すので。

投稿2019/01/12 03:15

編集2019/01/12 03:21
Kaiser

総合スコア295

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

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

0

ユーザとパスの管理方法わからんですが・・・コメントにあったやりかた。
switch case使うなら2次元配列でも十分な気がしますが。

java

1Map<String, String[]> userMap = new HashMap<String, String[]>(); 2{ 3// userMap.put(user, new String[] {"path1", "path2"}); 4 userMap.put("A", new String[] {"A1", "A2"}); 5 userMap.put("B", new String[] {"B1", "B2"}); 6 userMap.put("C", new String[] {"C1", "C2"}); 7} 8 9int fileButton = 0; 10 11System.out.println(userMap.get("A")[fileButton]); 12System.out.println(userMap.get("B")[fileButton]); 13System.out.println(userMap.get("C")[fileButton]); 14 15// if fileButton2.pressed() fileButton = 1; 16fileButton = 1; 17 18System.out.println(userMap.get("A")[fileButton]); 19System.out.println(userMap.get("B")[fileButton]); 20System.out.println(userMap.get("C")[fileButton]);

投稿2019/01/11 11:59

momon-ga

総合スコア4820

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

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

0

一応w 回答としては、MAPを使ってIDで検索d^^
IDにマッチしたMAPから、ボタンに対応したパスをもってくる。

ユーザの情報(ID,パス1、パス2)は、ファイルから読み込むようにすれば、MAPに収容するユーザは可変にできます。

投稿2019/01/11 09:41

cateye

総合スコア6851

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

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

cateye

2019/01/11 09:44

c++ なら、処理も書けるんですがw・・・ javaはいまいちなんで^^:ご容赦くださいm(_"_)m
guest

0

ファイルが2種類固定、ユーザーがクラスになっているのならboolean値を持つでしょうか。

User user = new User(); if( user.onefile ) // ファイル1の処理 else // ファイル2の処理 class User { boolean onefile = false; }

修正依頼でcateyeさんが言っていたmapとは、
ユーザー1 ファイル1
ユーザー2 ふぁいる1
ユーザー3 ファイル2
みたいに、ユーザー名とファイル1か2かをリンクするやり方です。
ちなみに私はmapは触ってないので処理は省略で。

また、一番上の方法はファイルが3つ以上あると対応できないので、その場合はintを渡すなど変更します。

あとは、条件分岐ではありませんがユーザーがクラスで(StringやIntegerも含む)配列なら
forを使うのもありでしょう。ただし、ユーザー名が多いとorがたくさんになったりするので、
めんどくさいです。結局ユーザーのクラスを持つことになるでしょう。

User[] users = { new User(), new User(), new User() }; // 手抜き for( int l = 0; l < users.length; l++ ){ if( users.onefile ) // ファイル1 else // ファイル2 } String[] usernames = { "ゆーざー", "ゆざ", "ゆうざあ" }; for( int l = 0; l < usernames.length; l++ ){ if( usernames[ l ].equals( "ゆーざー" ) || usernames.equals( "ゆうざあ" ) ) // ファイル1 else // ファイル2 }

最後に ファイル処理をやっているということですが、結構この処理は似たような動作が多いです。
やっていないのなら、関数化をおすすめします。これだけで、かなりソースが短く見やすくなるかと。
長文失礼しました。

投稿2019/01/11 09:15

yukkuri

総合スコア624

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問