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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

1回答

1303閲覧

1.ページを進める方法

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2021/07/20 14:44

編集2021/07/26 07:39

前提・実現したいこと

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

検索

public void actionPerformed(ActionEvent e) { // TODO 自動生成されたメソッド・スタブ readBook(); //オブジェクト型の配列生成 Book bk[] = new Book[4]; bk[0] = new Book(data[0][0], data[0][1], data[0][2], data[0][3], data[0][4]); bk[1] = new Book(data[1][0], data[1][1], data[1][2], data[1][3], data[1][4]); bk[2] = new Book(data[2][0], data[2][1], data[2][2], data[2][3], data[2][4]); bk[3] = new Book(data[0][0], data[0][1], data[0][2], data[0][3], data[0][4]); //検索文字列を取得 String gStr = text1.getText(); //部分文字列検索 int result1 = book1.getTitle().indexOf(gStr); int result2 = book1.getAuthor().indexOf(gStr); int result3 = book1.getPublisher().indexOf(gStr); int result4 = book1.getYop().indexOf(gStr); int result5 = book1.getIsbn().indexOf(gStr); int result6 = book2.getTitle().indexOf(gStr); int result7 = book2.getAuthor().indexOf(gStr); int result8 = book2.getPublisher().indexOf(gStr); int result9 = book2.getYop().indexOf(gStr); int result10 = book2.getIsbn().indexOf(gStr); int result11 = book3.getTitle().indexOf(gStr); int result12 = book3.getAuthor().indexOf(gStr); int result13 = book3.getPublisher().indexOf(gStr); int result14 = book3.getYop().indexOf(gStr); int result15 = book3.getIsbn().indexOf(gStr); int result16 = book4.getTitle().indexOf(gStr); int result17 = book4.getAuthor().indexOf(gStr); int result18 = book4.getPublisher().indexOf(gStr); int result19 = book4.getYop().indexOf(gStr); int result20 = book4.getIsbn().indexOf(gStr); if (e.getSource() == button1) { //検索ボタン if (result1 != -1 || result2 != -1 || result3 != -1 || result4 != -1 || result5 != -1) { text2.setText(book1.getTitle()); text3.setText(book1.getAuthor()); text4.setText(book1.getPublisher()); text5.setText(book1.getYop()); text6.setText(book1.getIsbn()); } } else if (e.getSource() == button3) { //進むボタン for (int i = 0; i < 3; i++) { if ((result6 != -1 || result7 != -1 || result8 != -1 || result9 != -1 || result10 != -1) && i == 0) { text2.setText(book2.getTitle()); text3.setText(book2.getAuthor()); text4.setText(book2.getPublisher()); text5.setText(book2.getYop()); text6.setText(book2.getIsbn()); } else if ((result11 != -1 || result12 != -1 || result13 != -1 || result14 != -1 || result15 != -1) && i == 1) { text2.setText(book3.getTitle()); text3.setText(book3.getAuthor()); text4.setText(book3.getPublisher()); text5.setText(book3.getYop()); text6.setText(book3.getIsbn()); } } } else if (e.getSource() == button2) { //戻るボタン if ((result11 != -1 || result2 != -1 || result3 != -1 || result4 != -1 || result5 != -1)) { text2.setText(book1.getTitle()); text3.setText(book1.getAuthor()); text4.setText(book1.getPublisher()); text5.setText(book1.getYop()); text6.setText(book1.getIsbn()); } } } }

試したこと

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

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

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

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

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

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

jimbe

2021/07/20 16:51 編集

まず、「オブジェクトも配列が出来る」ということはご存じでしょうか。 actionPerformed 内で 「//インスタンス生成」として book1~4 を生成していますが、このように「番号で区別する変数」が出来たということはその一連のデータは配列的に管理できるということを表しています。 ですのでこれを(まず)配列にしてみては如何でしょうか。
退会済みユーザー

退会済みユーザー

2021/07/21 17:10 編集

ご指摘ありがどうございます。
jimbe

2021/07/21 01:33 編集

コメント欄にはコードを書く「```」等が使えませんので、コードはご質問を編集して追加なり修正なりしてください。 さて、ここから必要な処理が二つ出来ます。一つは「条件に合った蔵書を見つける事」もう一つは「進む・戻るボタンでそれらを1つずつ表示すること」です。 プログラミングの進め方は人それぞれですが、一度に二つ以上のことを進めるのは慣れないうちは大変です。結果が分かり易いほうがモチベが保ち易いこともあるので、ひとまず条件による絞り込みは無視して全部の蔵書を「進む・戻るボタン」を駆使して見れるようにしては如何でしょう。 (「部分文字列検索」~の result に代入している部分や「検索ボタン」、進む・戻るボタンの所にある result を使っている if 文等をバッサリ消してしまって、「進む」「戻る」ボタンの機能のみとしてしまったほうが良いかと思います。勿体ないと思うのでしたら「メモ帳」等にカット&ペーストで取っておいても良いです。)
jimbe

2021/07/21 02:02

蛇足ですが、BookData のタイトルのスペル間違ってませんか。
退会済みユーザー

退会済みユーザー

2021/07/21 17:10 編集

ご指摘ありがとうございます。
jimbe

2021/07/21 05:22

配列化することで最初の書が( book1 では無く)bk[0], (book2 では無く)bk[1] といった具合に [] の中の数値によって n 番目の書を対象とすることが出来るようになりました。そして、[] の中には変数が使用できますね。 readBook 内で data[index] や data[i] 等としていることと同じです。 さて、仮に「 n 番目の書を表示する」為の変数として(int 型の) bookIndex なる変数を作ることにします。 bookIndex が 0 の状態で「 bk[bookIndex] 」という部分を通ると、それは bk[0] と同じ、すなわち最初の書を指します。 bookIndex が 1 の状態で同じく「 bk[bookIndex] 」という部分を通ると、それは bk[1] と同じ、すなわち2番目の書を指します。 では、2番目の書を示している状態から、最初の書を示すようにするにはどうすればいいのかといいますと… bookIndex から 1 を引いたうえで、bk[bookIndex] を通ればよいことになります。 実装的には、まず、int bookIndex をフィールドとして宣言します。 次に bk[bookIndex] で示される書の情報を各テキストフィールドに設定(表示)するメソッド(仮に printBook() )を作ります。して 次の書を表示する場合には bookIndex を +1 して printBook() を呼び、前の書を表示する場合には bookIndex を -1 して printBook() を呼ぶことで、前後へのページ移動が出来ます。 なお、bookIndex がマイナスになったり、書数以上にならないようにしておかないと、異常終了してしまいますのでお気を付けください。
退会済みユーザー

退会済みユーザー

2021/07/21 16:45

解決することができました。ありがとうございました。
jimbe

2021/07/21 17:14

解決したからといって内容を消さないでください。 このサイトは、後から来る人への情報のデータベースの役割も想定されています。
guest

回答1

0

ベストアンサー

個数があらかじめわかっている場合は配列もいいですが、個数が不明な場合はリストを使いましょう。
ArrayList (Java Platform SE 8 )

せっかくBookクラスを作ったんですから、最初からBookクラスに入れてしまいましょう(多次元配列はややこしくなりがちなので、できるだけ避けたほうがいいです)

Java

1//String data[][]; 2ArrayList<Book> books;

この時、複数の蔵書がマッチした場合、進むボタンを押すと2個目、3個目の蔵書情報がテキストフィールドに表示でき、戻るボタンを押すと前の蔵書情報を表示する方法を教えて頂きたいです。

if分でどうにかやろうと思いましたが全くできませんでした。

最初は1件だけの表示だったんでしょうか?(それを拡張しようとして今こうなっている?)
何件ヒットするかわからない以上、このアプローチ(if文)はどう考えても無理がありますよね?

よく考えてください。
棚に複数の本があって、今そのうちの一冊を手に取っています。
次に進むにはそれを棚に返し、隣の本を手に持ちますね?

つまり蔵書とは別で「今手に取っている本」という変数がいるのです。
本自体を変数にする(Book currentのような)場合もありますが、今回は棚の左から何番目という「インデックス番号」のほうがいいでしょう。

進むにはインデックスを増やし、戻るときは減らします(もちろん行き過ぎないようにする必要があります)

検索も同じように蔵書とは別の、「検索にヒットした本のリスト」変数を用意すればいいでしょう。

Java

1import java.awt.GridBagConstraints; 2import java.awt.GridBagLayout; 3import java.awt.event.ActionEvent; 4import java.awt.event.ActionListener; 5import java.io.BufferedReader; 6import java.io.FileReader; 7import java.util.ArrayList; 8import javax.swing.BorderFactory; 9import javax.swing.JButton; 10import javax.swing.JFrame; 11import javax.swing.JLabel; 12import javax.swing.JPanel; 13import javax.swing.JTextField; 14 15 16public class BookData extends JFrame implements ActionListener { 17 public static void main(String[] args) { 18 new BookData("Search Book").setVisible(true); 19 } 20 21 private JButton searchButton = new JButton("検索"); 22 private JButton previousButton = new JButton("<"); 23 private JButton nextButton = new JButton(">"); 24 private JButton saveButton = new JButton("検索結果保存"); 25 26 private JTextField searchText = new JTextField(); 27 private JLabel resultText = new JLabel(); 28 private JLabel indexText = new JLabel(); 29 30 private JTextField titleText = new JTextField(); 31 private JTextField authorText = new JTextField(); 32 private JTextField publisherText = new JTextField(); 33 private JTextField yopText = new JTextField(); 34 private JTextField isbnText = new JTextField(); 35 36 private ArrayList<Book> books = new ArrayList<Book>(); // 全部の本 37 private ArrayList<Book> searchBooks = new ArrayList<Book>(); // 検索にヒットした本 38 private int index; // 今表示中の本の(searchBooks中の)インデックス番号 39 40 BookData(String title) { 41 super(title); 42 setSize(800, 400); 43 setLocationRelativeTo(null); 44 setDefaultCloseOperation(EXIT_ON_CLOSE); 45 46 initialize(); 47 readCsv("booklist.csv"); 48 updateText(); 49 } 50 51 private void initialize() { 52 JPanel panel = new JPanel(new GridBagLayout()); 53 panel.setBorder(BorderFactory.createEmptyBorder(10, 20, 10, 20)); 54 GridBagConstraints gbc = new GridBagConstraints(); 55 gbc.fill = GridBagConstraints.HORIZONTAL; 56 gbc.weighty = 1; 57 58 gbc.gridy = 0; 59 panel.add(new JLabel("検索語:"), gbc); 60 gbc.gridy = 1; 61 panel.add(new JLabel("結果:"), gbc); 62 gbc.gridy = 2; 63 panel.add(new JLabel("タイトル:"), gbc); 64 gbc.gridy = 3; 65 panel.add(new JLabel("著者:"), gbc); 66 gbc.gridy = 4; 67 panel.add(new JLabel("出版社:"), gbc); 68 gbc.gridy = 5; 69 panel.add(new JLabel("出版年:"), gbc); 70 gbc.gridy = 6; 71 panel.add(new JLabel("ISBN:"), gbc); 72 73 gbc.gridx = 1; 74 gbc.gridy = 0; 75 gbc.weightx = 1; 76 panel.add(searchText, gbc); 77 gbc.gridy = 1; 78 panel.add(resultText, gbc); 79 gbc.gridy = 2; 80 panel.add(titleText, gbc); 81 gbc.gridy = 3; 82 panel.add(authorText, gbc); 83 gbc.gridy = 4; 84 panel.add(publisherText, gbc); 85 gbc.gridy = 5; 86 panel.add(yopText, gbc); 87 gbc.gridy = 6; 88 panel.add(isbnText, gbc); 89 90 gbc.anchor = GridBagConstraints.CENTER; 91 gbc.fill = GridBagConstraints.NONE; 92 gbc.gridx = 0; 93 gbc.gridy = 7; 94 gbc.gridwidth = 2; 95 JPanel panel2 = new JPanel(); 96 panel2.add(previousButton); 97 panel2.add(indexText); 98 panel2.add(nextButton); 99 panel.add(panel2, gbc); 100 101 gbc.anchor = GridBagConstraints.EAST; 102 gbc.gridy = 7; 103 panel.add(saveButton, gbc); 104 105 gbc.anchor = GridBagConstraints.CENTER; 106 gbc.gridx = 2; 107 gbc.gridy = 0; 108 gbc.gridwidth = 1; 109 gbc.weightx = 0; 110 panel.add(searchButton, gbc); 111 112 add(panel); 113 114 searchText.addActionListener(this); // Enterキーを押したとき 115 searchButton.addActionListener(this); 116 previousButton.addActionListener(this); 117 nextButton.addActionListener(this); 118// saveButton.addActionListener(this); 119 } 120 121 private void readCsv(String filePath) { 122 try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { 123 String line; 124 while ((line = br.readLine()) != null) { 125 String[] split = line.split(","); 126 Book book = new Book(split[0], split[1], split[2], split[3], split[4]); 127 books.add(book); 128 searchBooks.add(book); 129 } 130 } catch (Exception e) { 131 e.printStackTrace(); 132 } 133 } 134 135 @Override public void actionPerformed(ActionEvent e) { 136 if (e.getSource() == searchButton || e.getSource() == searchText) { 137 searchBooks.clear(); 138 index = 0; 139 String s = searchText.getText(); 140 for (Book book : books) { 141 // sが空文字列 "" だった場合true なので空で再検索すると全件表示 142 if (book.contains(s)) { 143 searchBooks.add(book); 144 } 145 } 146 } else if (e.getSource() == nextButton) { 147 if (index < searchBooks.size() - 1) { 148 index++; 149 } 150 } else if (e.getSource() == previousButton) { 151 if (0 < index) { 152 index--; 153 } 154 } 155 156 updateText(); // 表示の更新 157 } 158 159 private void updateText() { 160 Book book; 161 if (searchBooks.isEmpty()) { // 検索結果がなかった時 162 // titleText.setText("") のようにするのは 163 // コードが重複するのでカラのBookを与えちゃう 164 book = Book.empty; 165 } else { 166 book = searchBooks.get(index); 167 } 168 169 resultText.setText(searchBooks.size() + " / " + books.size() + " 件"); 170 indexText.setText(String.valueOf(index + 1)); 171 172 titleText.setText(book.getTitle()); 173 authorText.setText(book.getAuthor()); 174 publisherText.setText(book.getPublisher()); 175 yopText.setText(book.getYop()); 176 isbnText.setText(book.getIsbn()); 177 } 178} 179 180class Book { 181 private String title; 182 private String author; 183 private String publisher; 184 private String yop; 185 private String isbn; 186 187 public static Book empty = new Book(); // カラのBook 188 189 private Book() {} // empty用 190 191 public Book(String title, String author, String publisher, String yop, String isbn) { 192 this.title = title; 193 this.author = author; 194 this.publisher = publisher; 195 this.yop = yop; 196 this.isbn = isbn; 197 } 198 199 public boolean contains(String s) { // どれかのメンバに部分一致しているかどうか 200 return title.contains(s) || author.contains(s) || publisher.contains(s) 201 || yop.contains(s) || isbn.contains(s); 202 } 203 204 public String getTitle() { return title; } 205 206 public void setTitle(String title) { this.title = title; } 207 208 public String getAuthor() { return author; } 209 210 public void setAuthor(String author) { this.author = author; } 211 212 public String getPublisher() { return publisher; } 213 214 public void setPublisher(String publisher) { this.publisher = publisher; } 215 216 public String getYop() { return yop; } 217 218 public void setYop(String yop) { this.yop = yop; } 219 220 public String getIsbn() { return isbn; } 221 222 public void setIsbn(String isbn) { this.isbn = isbn; } 223}

以降本題とは関係ない細かい点。

button1) { //検索ボタン

コメントをつけるくらいなら、わかりやすい変数名にしましょう。

文字列が含まれているかどうかは、indexOfよりcontainsのほうがわかりやすいです。
String#contains (Java Platform SE 8 )

一覧性を考えると、JTableを検討されてもよさそうです(結構難しいですが^^;
JTable (Java Platform SE 8 )

How to Use Tables (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

投稿2021/07/21 08:52

TN8001

総合スコア9317

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

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

退会済みユーザー

退会済みユーザー

2021/07/21 16:42 編集

回答ありがとうございます。 とても分かりやすいコードで理解することができました。 ベストアンサーにさせて頂きます。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問