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

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

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

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

Q&A

1回答

343閲覧

特定の形式のファイルを読み込みそれをそのまま表示するプログラム

kd3

総合スコア14

Java

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

0グッド

0クリップ

投稿2017/07/09 19:25

import java.util.*; import java.io.*; public class Graph{ int num = 0; String filename; Node[] nodes; Graph(String filename){ this.filename = filename; loadGraph(filename); } class Edge{ private int to; private double omomi; Edge(int to,double omomi){ this.to = to; this.omomi=omomi;} int To(){ return to; } double Omomi(){return omomi;} } class Node{ int id; ArrayList<Edge> list = new ArrayList<Edge>(); ArrayList<Edge> list2 = new ArrayList<Edge>(); Node(int id){ this.id = id; } void addToList(int nid,double omomi){ list.add(new Edge(nid,omomi)); } ArrayList<Edge> getList(){ return list; } ArrayList<Edge> getList2(){ return list2; } } void loadGraph(String filename){ this.nodes = new Node[1000]; try{ FileReader fr = new FileReader(filename); BufferedReader br = new BufferedReader(fr); String line; while((line = br.readLine()) != null){ String[] node = line.split(":"); int nOde = Integer.parseInt(node[0]); nodes[num] = new Node(nOde); String[] edge = node[1].split(","); for(int h=0;h<edge.length;h++){ String[] aaa=edge[h].split("@"); int y = Integer.parseInt(aaa[0]); double z = Double.parseDouble(aaa[1]); nodes[num].addToList(y,z); } num++; } }catch(IOException e){ return ; } } void printGraph(){ for(int i = 0;i < num;i++){ System.out.print(i+":"); for(int j = 0;j < nodes[i].getList().size();j++){ System.out.print(nodes[i].getList().get(j).To()+"@"+nodes[i].getList2().get(j).Omomi()); if(j < nodes[i].getList().size() - 1){ System.out.print(","); } } System.out.println(); } } } class GraphTester{ public static void main(String[] args){ String filename = args[0]; Graph graph = new Graph(filename); graph.printGraph(); } }

このプログラムをつかって
java GraphTester a.txtで(以下a.txtの中身です)

0:1@2.0,3@6.0,4@1.0 1:6@3.0

0:1@2.0,3@6.0,4@1.0 1:6@3.0

と元通り表示させたいのですが

C:\Users\user\Desktop>java GraphTester a.txt 0:Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size : 0 at java.util.ArrayList.rangeCheck(Unknown Source) at java.util.ArrayList.get(Unknown Source) at Graph.printGraph(Graph.java:69) at GraphTester.main(Graph.java:83)

が出てきてできません。
どこを直せばできるようになりますか?

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

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

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

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

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

swordone

2017/07/09 20:51

コードが読みづらいです。ブロックごとに字下げしてください。
guest

回答1

0

Nodeクラスにlist2が宣言されていますが、これに何も入れていません。
対して、printGraphからgetList2でListを取得し、そこから要素を取り出そうとしていますが、
何も入っていないので取り出せません。
omomiの情報もnidとともにEdgeクラスの情報として入っているため、list2自体が全くの無意味です。

Node[0]の中身 | list | list2 | ------------------------- |Edge(1, 2.0)| | |Edge(3, 6.0)| | |Edge(4, 1.0)| | この状態でprintGraph中、getList2からget(j)しようとすると、 何も入っていないlist2から取り出そうとするので例外発生

投稿2017/07/09 22:53

編集2017/07/09 23:53
swordone

総合スコア20651

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

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

kd3

2017/07/09 23:21

list2にはomomiを入れるつもりだったのですが、この状態だと、読み込むだけ読み込んでlist2に入れられてない状態、ということですか?
swordone

2017/07/09 23:26

ご自分のコードをよく読んでください。omomiに相当する数はEgdeクラスのコンストラクタに渡され、Edgeインスタンスのメンバとして格納されます。つまり、nidもomomiもEgdeインスタンスの要素としてともにlistに入れられており、list2は一切使用されていません。 listからインスタンスを取り出せばどちらも取得できることになります。
kd3

2017/07/10 01:49

ということは、list2そのものを考えないことにして、list2自体を消して、nodes[i].getList2().get(j).Omomi()をnodes[i].getList().get(j).Omomi()に変更することで正常に表示できる、ということですか?
swordone

2017/07/10 03:03 編集

見間違いをしました。そのとおりです。
kd3

2017/07/10 04:13

解決しました。ありがとうございました。
swordone

2017/07/10 04:51

私としては、文字列化をEdgeやNodeのtoStringメソッドに任せてしまいたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問