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

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

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

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

Q&A

解決済

2回答

2069閲覧

URLで指定されているパラメータを項目ごとにlistに入れたい

daichaso

総合スコア7

Java

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

0グッド

0クリップ

投稿2018/04/26 02:07

編集2018/04/26 03:22

前提・実現したいこと

URLで以下のように指定がある場合に項目ごとに変数に入れたい。(1つしかないものはListではなくStringやint、booleanに格納する)


http://xxx.jp/a1/b2/c3/d4-e5/f6
aはString
bはboolean
cとd-e、fはList<String>とします。

xxx.jpまではサーバルート情報で同じなのでそれ以降が必要となるため
httpServletRequestのgetRequestURIを使用して
/a/b/c/d-e/f
を取得し、/で分割を行いパラメータのチェックおよび変数への格納を行います。

該当のソースコード

Java

1public boolean test(HttpServletRequest request, HttpServletResponse response) { 2 String resultA = ""; 3 boolean resultB = false; 4 List<String> resultC = new ArrayList<>(); 5 List<String> resultD = new ArrayList<>(); 6 List<String> resultF = new ArrayList<>(); 7 //URI部分の取得 8 String uri = request.getRequestURI(); //ここで/a/b/c/d-e/fが取得できている。 9 //「/」で分割する。 10 String[] uriAry = uri.split("/"); 11 //URIの先頭が「/」であり1つめは必ず空白になるためループは1から回す。 12 for (int i = 1; i < uriAry.length; i++) { 13 if (uriAry[i].startsWith("a")) { 14 resultA = uriAry[i].substring(uriAry[i].indexOf("a") + 1); 15 } 16 if (uriAry[i].startsWith("b")) { 17 resultB = uriAry[i].substring(uriAry[i].indexOf("b") + 1); 18 } 19 if (uriAry[i].startsWith("c")) { 20 resultC.add(uriAry[i].substring(uriAry[i].indexOf("c") + 1)); 21 } 22 if (uriAry[i].startsWith("d")) { 23 resultD.add(uriAry[i].substring(uriAry[i].indexOf("d") + 1)); 24 25 } 26 if (uriAry[i].startsWith("f")) { 27 resultF.add(uriAry[i].substring(uriAry[i].indexOf("f") + 1)); 28 29 } 30 } 31}

###問題点、悩み
別クラスからこのURLのパラメータ取得だけを行いたい場合にメインメソッドではなく別メソッドに出しておかないといけないかと思います。
その際にまとめて行い、1つの変数にしてreturnする方法なども知れたらと思います。

補足情報(FW/ツールのバージョンなど)

Java8、Spring

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

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

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

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

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

m.ts10806

2018/04/26 02:13

質問内容がテンプレートのままで何もありませんが、編集中でしょうか?
m.ts10806

2018/04/26 02:53

質問テンプレートを利用されたほうが良いかと・・・。結局現在の質問内容だと丸投げで、どのようなコードを書いているかわからないので「できている」といわれても「できている」判断が見ている人にはできません。
fuzzball

2018/04/26 06:17 編集

入力例を書いて下さい。例えば、bは btrue/bfalse と書くのでしょうか?Listというのもよく分かりません。/c2/c3/c4 → resultC = [2, 3, 4] ということでしょうか?d-e もどういうフォーマットなのか分かりません。
guest

回答2

0

ベストアンサー

バラバラに変数化するよりも、Mapで扱ったほうがいいと思います。さらにJava8とのことなので、Streamも活用してみます。

java

1public boolean test(HttpServletRequest request, HttpServletResponse response) { 2 //URI部分の取得 3 String uri = request.getRequestURI(); //ここで/a/b/c/d-e/fが取得できている。 4 //「/」で分割する。 5 String[] uriAry = uri.split("/"); 6 //URIの先頭が「/」であり1つめは必ず空白になるためループは1から回す。 7 Map<Character, List<String>> map = Arrays.stream(uriAry).skip(1L).collect(Collectors.groupingBy(s -> s.charAt(0), Collectors.mapping(s -> s.substring(1), Collectors.toList()))); 8}

あとは各文字ごとに取り出してください。
元のコードでbooleanにStringを入れようとしてたりわからない部分があったので、とりあえずマップの値をList<String>にしておきました。

投稿2018/04/26 05:31

swordone

総合スコア20651

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

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

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問