プロが教える店舗&オフィスのセキュリティ対策術

Java プログラミングのmapの収納の仕方について
プログラミング(Java)の勉強をしているのですが正解もわからず苦戦しております。そこでプログラミングができる方に教えていただきたいです。
問題文に「全データを適切なListあるいはMapに収納せよ。」とあり、今回私はListを使ってデータ内容を収納しました。しかし、問題文からMapでも収納できるということがわかるのですがMapはキーの型名、値の型名を指定しなければなりません。ですが今回収納するデータはたくさんの文字が羅列してあるものであり、それのキーや値がよくわかりません。このように全データをMapに収納するにはどのようにすればいいでしょうか?
詳しく教えてほしいです。

写真のものは、Listやmapで収納する楽天市場レビューのサンプルデータです
≪問題文≫
楽天市場レビューのサンプルデータについて、レビュー1つ分を表すのに適切なクラスを作成せよ。
メインメソッドでデータ(TSV形式)の全てを読み込み、全データを適切なListあるいはMapに収納せよ。
ListあるいはMapに収納されたレビュー全てを、LIBSVM形式で書き出せ

作成したコード
package simonmon;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Simon10 {

public static void main(String[] args) {
try {
File csv = new File("C://Users/bi19029/documents/楽天サンプル/ichiba04_review201001_20140221-sample.tsv");

BufferedReader br = new BufferedReader(new FileReader(csv));

// 最終行まで読み込む
String line = "";

while ((line = br.readLine()) != null) {

// 1行をデータの要素に分割
StringTokenizer st = new StringTokenizer(line, ",");

while (st.hasMoreTokens()) {
// 1行の各要素をタブ区切りで表示
// System.out.print(st.nextToken() + "\t");
// System.out.println();

List<String> list = new ArrayList<>(); //list文

list.add(st.nextToken() + "\t");

System.out.println(list);
}
}
br.close();


} catch (FileNotFoundException e) {
// Fileオブジェクト生成時の例外捕捉
e.printStackTrace();
} catch (IOException e) {
// BufferedReaderオブジェクトのクローズ時の例外捕捉
e.printStackTrace();
}


}
}

「Java プログラミングのmapの収納の」の質問画像

A 回答 (1件)

うーむ、これも良く分からんなぁ。


いや、データが手元にあればどうにでも出来るんだけど、写真じゃ小さいんで手作業で書き写すのもアレですし・・・・・・。
よってここでは一般論を。

JavaのMapってなんじゃらホイ、とか思ったんだけど、要するに「ハッシュテーブル」ですよね。イカしたプログラミング言語には大体これは実装されているデータ型です。ANSI Common Lispから始まって、Python、Rubyなんかにも実装されています。
難点は「プログラミング言語によって呼び名が違う」って事くらいでしょうか(笑)。だからJavaのMapって言われると「何のことやらサッパリ分からん」って事になってしまう。
いや、ハッシュテーブルです。それでキマリ。

ええと、原理的には元々こいつはリストなのです。「連想リスト」ってのが元ネタです。
恐らく原型を作ったLisp的な表記で書きますけど、元々はこんなヤツ(データ形式)なんですね。

'((プログラミングができない人 . "Java") (cametan42 . "Python"))

こういう「ペア」だけで構成されたリストを、これはもうそのままデータ型は「リスト」なんですが、形式として「連想リスト」と呼びます。

➜ ~ clisp
i i i i i i i ooooo o ooooooo ooooo ooooo
I I I I I I I 8 8 8 8 8 o 8 8
I \ `+' / I 8 8 8 8 8 8
\ `-+-' / 8 8 8 ooooo 8oooo
`-__|__-' 8 8 8 8 8
| 8 o 8 8 o 8 8
------+------ ooooo 8oooooo ooo8ooo ooooo 8

Welcome to GNU CLISP 2.49.92 (2018-02-18) <http://clisp.org/>

Copyright (c) Bruno Haible, Michael Stoll 1992-1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2018

Type :h and hit Enter for context help.

[1]> (defvar alist '((プログラミングができない人 . "Java") (cametan42 . "Python"))) ;; 連想リストを定義
ALIST
[2]> (assoc 'プログラミングができない人 alist) ;; 連想リストからキーを使ってデータを探す
(プログラミングができない人 . "Java")
[3]> (assoc 'cametan42 alist) ;; 連想リストからキーを使ってデータを探す
(CAMETAN42 . "Python")
[4]>

とまぁ、例えば「プログラミングができない人」と「Java」が関連付けられてたら「プログラミングができない人」で探せばそのデータが返ってくる。「cametan42」と「Python」が関連付けられてたらそのデータが返ってくる。
至極簡単ですね。そう、これは「検索の為の」データ型なんです。

ただ、リストの場合、長くなればなるほど、リストのケツの方へアクセスするのに時間がかかります。これがリストの欠点で、リストは先頭から順繰りに探っていくので、リストの最初の方のデータを返すのはすぐなんですけどね。
これを解決する為に「発想は連想リストなんだけど、実装はちょっと工夫しようぜ」と作られたデータ型がハッシュテーブルです。ただ、基本的な使い方とかは全く連想リストと同じです。

と言う事は、ですよ。

> ですが今回収納するデータはたくさんの文字が羅列してあるものであり、それのキーや値がよくわかりません。

要するに貴方が好きに決めて良いのです。はい。
キーを何にするか。検索した時何を返して欲しいのか。貴方が好きに決めて良い。

ただ、注意事項は一つだけ。それは当然、「同じキーが2つあったら、返せる値も返せない(ないしは貴方の予想と違う値が返ってくる)」。これには気をつけましょう。そしてこれは「言われりゃその通りだよな」って思うでしょう。

[4]> (push '(cametan42 . "Common Lisp") alist)
((CAMETAN42 . "Common Lisp") (プログラミングができない人 . "Java")
(CAMETAN42 . "Python"))
[5]> (assoc 'cametan42 alist)
(CAMETAN42 . "Common Lisp")
[6]>

[4]でデータを追加してますが、キー「cametan42」のデータが2つになりました。検索すると新しく追加したデータは返ってきますが、"Python"があるデータは無視されてそのままです。これは良くないですよね。
「キーはユニークであるべき」って事です。

さぁ、まずは手持ちのデータを良く見て下さい。何をキーとするべきなのか。それはユニークな値なのか。それは貴方が判断するべき事柄です。

あるいは「全部格納出来たらしたい」って思う場合もあるでしょう。その場合はハッシュテーブルのハッシュテーブルを作ったりして「木構造」を構築しなきゃいけません。
でもそれも、どっちにせよ「貴方が決める事」ですよね。そしてプログラミング以前にデータとにらめっこして、どういうデータ構造になってるのか、まず最初にそれがわからないとならない、って事ですよ。
    • good
    • 0
この回答へのお礼

助かりました

重ね重ねありがとうございます
しっかり参考にさせて頂き、今後の学習にいかします

お礼日時:2020/08/22 23:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!