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

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

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

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

3回答

3705閲覧

Javaのリスト内検索indexOf()でー1が返ってきてしまう

退会済みユーザー

退会済みユーザー

総合スコア0

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2020/10/16 00:26

javaで商品管理売上管理システムを作っています。
1画面目で選択した商品名のリストをindexOf()で検索すると、
データは存在しているのに-1が返ってきてしまい、
その後の処理でエラーを吐いてしまいます。

SalesSystemController.javaのaddメソッド内

Item newList = RecordManager.findItem(form.getGoodsName());

でRecordManager.javaのfindItemメソッドに入り、

int index = list.indexOf(new Item("", goodsName, 0,0,0));

でindexにー1が入ってしまいます。

デバッグでみると、findItemメソッドのgoodsNameにはきちんと商品名(油性ボールペンなど)が入っています。

ここが通らないとその先が何もできないのですが、解決方法が分かる方がいましたら教えてください。
よろしくお願いいたします。

開発環境等
eclipse
Windows10
tomcat8

エラーメッセージ:
Request processing failed; nested exception is java.lang.ArrayIndexOutOfBoundsException: -1

java

1SalesSystemController.java 2 3@Controller 4@RequestMapping(value = "/system") 5public class SalesSystemController { 6 7 private static final String INIT = "init"; // 初期画面 8 private static final String ADD = "add"; // 明細追加画面 9 private static final String FIX = "fix"; // 売上登録画面 10 11***********初期画面表示前の処理記述あり。*********** 12 13 @RequestMapping(params = "add") 14 public String add(SalesForm form, Model model) { 15 // 数値でない場合、未入力の場合はcatchへ遷移 16 try { 17 int point = Integer.parseInt(form.getPoint()); 18 // 1未満or100以上の場合はエラーメッセージ表示 19 if (point < 1 || point > 100) { 20 model.addAttribute("error", "点数には 1 以上 100 以下の整数を入力してください。"); 21 return INIT; 22 }else { 23 // 商品名の売上点数取得 24 Item newList = RecordManager.findItem(form.getGoodsName()); 25 int oldPoint = newList.getQuantity(); 26 // 売上点数+point 27 point = point + oldPoint; 28 newList.setQuantity(point); 29 // リストの該当商品に新データをセット 30 RecordManager.updateItem(newList); 31 32 // formデータ設定 33 model.addAttribute("allList", RecordManager.getItemList()); // 商品データ取得 34 model.addAttribute("nameList", RecordManager.makeNameList()); // 商品名リスト設定 35 model.addAttribute("message", "明細に追加しました。"); // メッセージ設定 36 model.addAttribute("error", ""); // エラー設定 37 form.setGoodsName(RecordManager.getFirstGoodsName()); // 商品名初期値設定 38 return ADD; 39 } 40 } catch (NumberFormatException e) { 41 model.addAttribute("error", "点数には 1 以上 100 以下の整数を入力してください。"); 42 return INIT; 43 } 44 }

java

1RecordManager.java 2 3public final class RecordManager { 4 5 /** 商品データ */ 6 private static final List<Item> list = new ArrayList<Item>(); 7 static { 8 list.add(new Item("A00101", "油性ボールペン", 60, 0, 0)); 9 list.add(new Item("A00201", "極細ボールペン", 120, 0, 0)); 10 list.add(new Item("A00301", "蛍光ペン6色セット", 420, 0, 0)); 11 list.add(new Item("A00401", "シャープペンシル", 100, 0, 0)); 12 list.add(new Item("A00501", "鉛筆H(1ダース)", 400, 0, 0)); 13 list.add(new Item("B00101", "無線綴ノートA4", 100, 0, 0)); 14 list.add(new Item("B00201", "リングノートA4", 120, 0, 0)); 15 list.add(new Item("B00301", "領収書", 350, 0, 0)); 16 list.add(new Item("C00101", "はさみ(青)", 128, 0, 0)); 17 list.add(new Item("C00201", "ステープラー", 338, 0, 0)); 18 list.add(new Item("C00301", "2穴パンチ", 128, 0, 0)); 19 list.add(new Item("C00401", "ゼムクリップ", 98, 0, 0)); 20 list.add(new Item("C00501", "消しゴム", 58, 0, 0)); 21 } 22 23 /** 24 * 引数で指定された商品名に一致する商品データを返却 25 * @param name 検索キーとなる商品名 26 * @return 検索結果の商品データ 27 */ 28 public static Item findItem(String goodsName) { 29 int index = list.indexOf(new Item("", goodsName, 0,0,0)); 30 return list.get(index); 31 }

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

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

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

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

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

ozwk

2020/10/16 00:30

Itemでequals()はオーバーライドしていますか?
退会済みユーザー

退会済みユーザー

2020/10/16 00:38

すみません、Itemでのオーバーライドとはどういうことでしょうか?
q_sane_q

2020/10/16 00:40

質問の本題とは関係なくて申し訳無いんですが ユニークっぽくない「商品名」を基準にデータ操作する設計は大丈夫なのかな…
guest

回答3

0

ベストアンサー

ArrayList.indexOfは、equalsで等しいかどうかを条件として抽出を行います(Java)。

Item.equalsが正しく実装されているか、そしてそれがnew Item("", goodsName, 0,0,0)を等しいと判定するものなのか、確認してみましょう。

投稿2020/10/16 00:34

maisumakun

総合スコア146018

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

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

退会済みユーザー

退会済みユーザー

2020/10/16 00:47

とても分かりやすい説明有難うございます。 確認しまして、Itemで定義したところうまく通りました! ご丁寧な対応感謝いたします。有難うございました。
guest

0

Itemクラスの equalsメソッドはどう定義されていますか?
これが間違っていると List の indexOf は正しく動きません。

投稿2020/10/16 00:36

kazuma-s

総合スコア8224

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

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

0

list.indexOfは、同一のオブジェクトは探してくれますが、都合よく名前だけ一致したものは探してくれません

投稿2020/10/16 00:31

y_waiwai

総合スコア88042

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

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

maisumakun

2020/10/16 00:37

Item.equalsの中身次第ですね。
y_waiwai

2020/10/16 00:40

あなたとは関わりのない回答者はそんなことはわかりません。 Itemsの定義を提示しましょうよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問