Java | 配列操作・多次元配列・ファイル・ユーザー入力・表示の複合処理

Java Java
スポンサーリンク

では上級実務アプリの CSV対応版 + GUI版サンプル をまとめて作ります。
ポイントは 配列操作 + ファイル読み書き + GUI表示 です。


上級実務アプリ:CSV対応・GUI版 月別売上管理システム(Java)


概要

  • 目的:商品ごとの月別売上を CSV から読み込み、GUI で表示・編集・合計確認
  • 特徴
    • CSV 入力/出力(実務でのデータ管理)
    • JTable で月別売上表を GUI 表示
    • 配列操作(コピー・集計・ソート)を反映
    • 集計結果を GUI で確認可能

CSVファイル例(sales.csv)

Pen,10,20,30,40,50,60,70,80,90,100,110,120
Notebook,5,10,15,20,25,30,35,40,45,50,55,60
Eraser,2,4,6,8,10,12,14,16,18,20,22,24
  • 1列目:商品名
  • 2列目以降:1月〜12月の売上

実装例(Java Swing + CSV対応)

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.io.*;
import java.util.Arrays;
import java.util.Vector;

public class SalesManagerGUI {
    public static void main(String[] args) {
        String csvFile = "sales.csv";
        Vector<String> products = new Vector<>();
        Vector<Vector<Integer>> salesData = new Vector<>();

        // CSV読み込み
        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] tokens = line.split(",");
                products.add(tokens[0]);
                Vector<Integer> months = new Vector<>();
                for (int i = 1; i < tokens.length; i++) {
                    months.add(Integer.parseInt(tokens[i]));
                }
                salesData.add(months);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // JTable作成
        String[] columns = {"商品","1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月","合計"};
        DefaultTableModel model = new DefaultTableModel(columns, 0);

        // データ追加
        for (int i = 0; i < products.size(); i++) {
            Vector<Object> row = new Vector<>();
            row.add(products.get(i));
            row.addAll(salesData.get(i));
            int sum = salesData.get(i).stream().mapToInt(Integer::intValue).sum();
            row.add(sum);
            model.addRow(row);
        }

        JTable table = new JTable(model);
        JScrollPane scrollPane = new JScrollPane(table);

        // GUI表示
        JFrame frame = new JFrame("月別売上管理");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 400);
        frame.setLayout(new BorderLayout());
        frame.add(scrollPane, BorderLayout.CENTER);

        // ボタン:CSV保存
        JButton saveBtn = new JButton("CSV保存");
        saveBtn.addActionListener(e -> {
            try (PrintWriter pw = new PrintWriter(new FileWriter("sales_updated.csv"))) {
                for (int i = 0; i < model.getRowCount(); i++) {
                    StringBuilder sb = new StringBuilder();
                    for (int j = 0; j < model.getColumnCount() - 1; j++) {
                        sb.append(model.getValueAt(i,j));
                        if (j < model.getColumnCount() - 2) sb.append(",");
                    }
                    pw.println(sb);
                }
                JOptionPane.showMessageDialog(frame, "CSV保存完了!");
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        });
        frame.add(saveBtn, BorderLayout.SOUTH);

        frame.setVisible(true);
    }
}
Java

ポイント解説

  1. CSV対応
    • BufferedReader で読み込み
    • PrintWriter で保存
    • 配列(Vector)に格納して加工可能
  2. 配列操作
    • Vector<Vector<Integer>> で多次元配列のように扱う
    • 合計やソートなどの集計を簡単に反映
  3. GUI表示
    • JTable に配列データをセット
    • スクロール可能で見やすい
  4. 編集対応
    • ユーザーが JTable 上で数値を編集可能
    • 保存ボタンで更新したデータを CSV に書き出せる

応用ポイント(上級)

  • JTable の列幅自動調整やフォント変更
  • 合計列の自動再計算(TableModelListener でリアルタイム更新)
  • ソート機能(商品名順・売上合計順)
  • GUI 上で月別グラフ(棒グラフ)を描画
  • 3次元配列に拡張し、複数店舗管理

💡 次のステップ

  1. 売上合計順に並び替え(GUI内ソート)
  2. 棒グラフ表示(JFreeChartやJavaFX)
  3. 複数CSV対応(複数店舗・複数年度)
Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました