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

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

ただいまの
回答率

90.33%

  • Java

    14437questions

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

樹形図を作成したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 561

Yoshi-5630

score 3

前提・実現したいこと

Javaで結果を樹形図で表示させたい

該当のソースコード

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;

public class DendrogramMax {


    public static void main(String[] args) throws IOException {
        int N = 647; //要素647
        HashMap<String, Integer> elemList = LoadDepth(); //elemListという名前のハッシュマップにLoadDepthを割り当てる
        double[][] similarity = LoadSimilarity(N, elemList); //double [][] similarityを(N,elemList)とする

        HashMap<Integer, ElemPair> objectList = new HashMap<Integer, ElemPair>(); //objectListを初期化

        for(int i = 0; i < N; i++){
            objectList.put(i, new ElemPair(i+"", i, null, 1));
            System.out.println(i+": "+i+", null, 1");
        } //要素の数647だけ要素のペアの作成を繰り返す

        System.out.println("---------------------------");

        String result = null;
        while(objectList.size()>1){
            double max_value = 0;
            int max_i = 0; //max_iに0を代入
            int max_j = 0; //max_jに0を代入
            int max_key1 = 0; //max_key1に0を代入
            int max_key2 = 0; //max_key2に0を代入
            for(int key1 : objectList.keySet()){
                ElemPair elemPair1 = objectList.get(key1);
                String[] elems1 = elemPair1.elems.replace("{", "").replace("}", "").split(",");
                for(int i = 0; i<elems1.length; i++){
                    for(int key2 : objectList.keySet()){
                        ElemPair elemPair2 = objectList.get(key2);
                        String[] elems2 = elemPair2.elems.replace("{", "").replace("}", "").split(",");
                        for(int j = 0; j<elems2.length; j++){
                            if(similarity[Integer.parseInt(elems1[i])][Integer.parseInt(elems2[j])] > max_value && !elems1[i].equals(elems2[j]) && key1 != key2){
                                max_i = Integer.parseInt(elems1[i]);
                                max_j = Integer.parseInt(elems2[j]);
                                max_key1 = key1; //類似度の高い要素をkey1とする
                                max_key2 = key2; ///類似度の高い要素をkey2とする
                                max_value = similarity[Integer.parseInt(elems1[i])][Integer.parseInt(elems2[j])];
                            }
                        }
                    }
                }
            }
            ElemPair elemLeft = objectList.get(max_key1); //要素の左側(〇,     )にmax_key1を格納
            ElemPair elemRight = objectList.get(max_key2);  //要素の右側(   ,  〇 )にmax_key1を格納
            objectList.remove(max_key1); //ObjectListからmax_key1を削除
            objectList.remove(max_key2); //ObjectListからmax_key2を削除
            objectList.put(max_key1, new ElemPair("{"+elemLeft.elems+","+elemRight.elems+"}", elemLeft, elemRight, max_value));
            result = "{"+elemLeft.elems+","+elemRight.elems+"}";
            System.out.println(objectList.size());
            System.out.println(" {"+elemLeft.elems+","+elemRight.elems+" }: "+elemLeft+", "+elemRight+", "+max_value);

        }


        System.out.println("---------------------------");
        System.out.println("Elements list:");
        for(String key: elemList.keySet()){ //アルファベット順に振った要素番号を647個表示されるまで繰り返す
            System.out.println(key+": "+elemList.get(key));
        }
        System.out.println();
        System.out.println("Dendrogram:");
        System.out.println(result); //結果を表示

    }

    private static HashMap<String, Integer> LoadDepth() throws IOException{
        HashMap<String, Integer> elemList = new HashMap<String, Integer>();
        FileReader fr = new FileReader("depth.csv"); //depthの読み込み
        BufferedReader br = new BufferedReader(fr);
        String line = null;
        int count = 0;
        while ((line = br.readLine()) != null) {
            elemList.put(line.split(",")[0], count);
            count++;
        }
        return elemList;
    }

    private static double[][] LoadSimilarity(int N, HashMap<String, Integer> elemList) throws NumberFormatException, IOException{
        String line = null;
        double[][] similarity = new double[N][N]; //MとNで多次元配列を初期化
        FileReader fr = new FileReader("similarity.csv"); //similarity.csvを読み込み
        BufferedReader br = new BufferedReader(fr);
        while ((line = br.readLine()) != null) {
            similarity[elemList.get(line.split(",")[2])][elemList.get(line.split(",")[3])] = Double.parseDouble(line.split(",")[1]);
        }

        return similarity; //similarityに返す
    }

}

class ElemPair{
    String elems;
    Object elem1;
    Object elem2;
    double distance;

    public ElemPair(String elems, Object elem1, Object elem2, double distance){
        this.elems = elems;
        this.elem1 = elem1;
        this.elem2 = elem2;
        this.distance = distance;
    }
}

実行結果

Dendrogram:
{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{0,{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{4,562},6},84},181},262},384},554},552},522},585},641},58},66},130},221},266},325},621},592},352},363},400},418},454},452},616},590},603},185},191},292},366},408},382},474},586},385},526},597},375},546},318},599},373},589},596},444},420},466},77},470},523},7},{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{27,467},43},41},81},116},132},189},237},253},284},315},336},372},369},376},421},461},500},569},580},406},100},34},64},107},137},194},239},276},265},347},360},479},465},488},630},605},44},141},161},179},293},374},381},442},446},417},547}},193},380},286},371},637},257},584},136},312},389},99},126},206},319},290},390},424},472},555},567},628},495},165},18},29},277},301},413},426},508},542},620},50},49},153},146},184},222},216},236},224},244},241},285},291},439},501},549},530},539},625},578}},247},398},545},59},69},294},233},507},37},73},148},169},166},164},198},212},235},254},351},321},353},425},536},62},85},106},125},131},159},147},167},187},190},182},207},201},226},243},283},305},327},505},553},532},138},214},317},273},289},433},320},456},636},338},412},90},114},270},533},32},297},55},142},274},98},407},579},583},158},157},119},83},188},299},334},431},314},489},139},288},395},387},225},386},192},486},151},45},246},337},362},560},570},576},2},205},326},333},518},513},89},451},529},627},638},9},38},42},60},71},86},82},103},97},105},117},127},154},150},170},174},180},223},208},240},272},260},303},393},427},485},564},573},531},624},591},607},610},46},94},110},156},177},348},378},359},397},471},511},613},626},588},3},70},438},416},415},432},475},450},341},28},409},392},388},278},514},340},234},255},261},310},391},26},183},367},15},121},23},264},639},543},623},635},95},21},175},10},30},88},350},144},24},355},499},36},39},594},306},401},31},168},492},335},324},484},145},581},370},544},256},280},343},346},428},329},609},227},342},483},203},411},506},615},510},76},619},493},307},344},357},494},186},608},331},419},248},535},47},503},645},571},614},345},447},482},304},509},364},618},178},12},78},296},101},118},173},504},487},550},527},16},96},160},323},74},68},113},140},496},490},561},515},521},540},537},617},632},601},414},61},574},115},396},92},512},404},163},410},383},437},124},379},269},349},54},1},602},577},572},8},122},282},252},455},91},612},316},251},464},176},263},459},582},538},332},210},598},534},644},595},354},402},93},502},308},87},213},643},209},5},75},{22,149}},{{{{219,429},640},516},463}},{232,629}},{497,575}},{559,565}},445},218},469},435},195},{{{{67,200},245},313},631}},281},295},267},481},520},368},48},199},377},642},476},457},17},162},220},622},135},{{{{{{{{{{{{{{{{{{{{13,356},365},517},230},40},322},563},460},172},{{{{102,358},403},443},449}},{{250,311},519}},462},{{20,478},120}},{{25,593},171}},80},{{108,196},399}},{197,238}},{{228,259},328}},143},541}},{{{{{{{{{53,453},634},{52,480}},109},{229,524}},{287,477}},441},{448,548}},422}},498},568},{{{{{{{{{{{{{{{{{{{{{{35,202},215},468},33},57},128},249},309},302},361},430},556},211},339},558},134},133},{{63,587},242}},155},{{{298,611},606},330}},405},{394,528}}},{{{19,551},{{56,436},104}},{{{279,258},423},633}}},525},440},300},14},123},152},217},458},557},600},65},231},271},{{{{{{{{{{11,275},491},51},79},112},129},204},268},434},473}},566},{{{72,646},111},604}}

用語説明

Elem・・・要素
{〇,〇}・・・類似度の高いペアを表している

イメージ

樹形図

イメージ図のような表示を実現したいのです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yuba

    2017/01/26 19:43

    表示と一言に言っても、この図をデスクトップアプリで出したいのですか、Webアプリで出したいのですか、Androidアプリ、それとも画像ファイルを生成したいのですか?

    キャンセル

  • Yoshi-5630

    2017/01/26 21:51

    yuba様 毎度ご質問ありがとうございます。 表示は、実行されたら、画像ファイルとして、樹形図を出力したいです

    キャンセル

  • t_obara

    2017/02/15 16:22

    http://stackoverflow.com/questions/24450246/recursive-method-to-draw-a-dendrogram ググると、例えば、このURLに示すようなものが幾つか出てきます。そのものズバリではないと思いますが、これらをベースに修正すれば良いのではないでしょうか。

    キャンセル

回答 2

check解決した方法

0

とりあえず、現状の{での表現で了承して頂きました。

ご意見ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

そもそも課題はなんなのか記載をしないと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    14437questions

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