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

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

ただいまの
回答率

90.47%

  • Java

    14141questions

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

二分探索木を使ってリストから特定の名前を見つけたい

解決済

回答 3

投稿 編集

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

runako67

score 2

java初心者です。

クラスでは、二分技について学習しました。
そして、今出されている課題が以下です。


新生児の名前とその名前の人数が載っているテキスト
例)太郎 40
花子 23
二郎 32


etc.
があります。それを元に、
入力した名前がリストに入っているかand何人なのかを、二分木探索を使って調べる
例)太郎を調べる

  • リストに入っている場合→ 表示
    例)太郎 40

  • いない場合 → 終了

どちらの場合でも、何回ノードを訪問したか数を表示させる

つまり整理すると
1)テキスト内の名前と人数を読み込む
2)それらを二分木でソートする
3)探す名前を入力させる
4)ならびかえられた二分木内をinorder, preorder, またはpostorderを使い徘徊
5)a.見つけた場合 名前と人数を出力
b.みつからなかった場合 終了
6)a,bどちらでもノード訪問の回数を出力
ということです。

おそらく読み込みまでだけできていると思います。
なるべく初心者でも理解可能なコードを待っています。
お願いいたします。

(以下が私ができるところまでやって見たコードになります)

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.*;
import javax.swing.JOptionPane;
public class HW5
{
  public static void main(String[] args) throws IOException
  {
    readFile();
    String name;
//名前を入力してもらう
    name = JOptionPane.showInputDialog("Enter the name that you are lookig for. ");
    BinaryTree(name);
    System.out.println(name);
  }

  private static String readFile() //namae.txtから全ての名前と数字を読み込む
  {
    try{
      File file = new File("namae.txt");
      FileReader filereader = new FileReader(file);
      int ch;
    }catch(FileNotFoundException e){
      System.out.println(e);
    }catch(IOException e){
      System.out.println(e);
    }return null;
  }
  private static Node BinaryTree(String n){
//ノード作成
    if(name==foundInText)
    {
//ここにif文を使いなまえがあるかどうかを調べる
      System.out.println((char)ch);
    }else
    {
      System.out.println("The name was not found. Enter anotehr name.");
    }
  }

}


file
"name..txt"
Buffy 0
Nathaniel 64
Elyse 823
Shyann 771
Saige 942
Arno 0
Ciara 284
Flo 0
Yamilet 804
Clay 402

```

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Zuishin

    2018/05/10 12:09

    何人いるかはノードの数を数えるのでなくノードのプロパティなので大丈夫かと。訂正は質問を編集してください。二分木を作る手順とソート済みデータを二分探索する手順は大きく違いますから回答も全く違うものになります。また配列には binarySearch() というメソッドが実装されていますので、それを使うと一行で済んでしまいます。それを使っていいかどうかも追記しなければなりません。

    キャンセル

  • runako67

    2018/05/10 12:36

    今変更して見ましたが、予想以上にわかりにくい説明になってしまったかもしれません。二分木を作る→二分探索木で探すが求められていることです。いくつノードを見回ったかを最終的に表示させなくてはいけないので、binarySearchを使うと答えが変わってしまうと思うので使えないと思います。

    キャンセル

  • Zuishin

    2018/05/10 14:06

    私は二分木と二分探索木は同じ意味で使いました。問題は二分木を構築することが求められるのかそれとも探索だけで良いのかということです。というのも、ソート済みの線形リストは二分木の一種ですが、リストや配列をソートすることをもって「二分木を構築する」とは普通言わないからです。最初に書いたように、あなたが何を知っていてどこまで用語が通じるのかということと、あなたの理解でなく正確な課題を書く必要があります。

    キャンセル

回答 3

checkベストアンサー

+2

途中までだったので、読み込み部分を作ってみました。
Node クラスが消えているみたいなので、適当に作成。

まず、 Nodeクラス

class Node
{
    public String NodeName = null;
    public int PersonCount = 0;
    Node Low = null;
    Node High = null;

    Node(String name, int count) {
        NodeName = name;
        PersonCount = count;
    }

    public void AddLeaf(Node leaf)
    {
        if (PersonCount > leaf.PersonCount) {
            if (Low == null)    Low = leaf;
                else            Low.AddLeaf(leaf);
        } else {
            if (High == null)    High = leaf;
                else            High.AddLeaf(leaf);
        }
    }
}


[追記: ここから]
問題文をよく読んでなかった。
名前で検索するので、ソートするキーは、名前にすべきでした。
--> NodeName とname の比較
とすれば、検索も Nodeクラスに、メソッドを追加して、
public int Find(String name) { ... }
として、同じような処理で OK

[追記: ここまで]

最初に、
Node root = null
読み込みは、読み込んだデータを以下の変数に入れる。
String name = 名前
int num = 人数
とし、
Node leaf = new Node(name, num);
if (root == null)    root = leaf;
else        root.AddLeaf(leaf);


後は適当に考えてください。
久々だったので、ちょっと時間が掛かりましたが、適切に読み込めば、ツリーができる事まで、確認済み。
問題を読み返すと、二分木検索がメインでしたか。と、すると Nodeクラスに検索メソッドを追加して、それを呼べば、良いですね。それも再帰を使えば、簡単に書けますが、ご自身で考えられた方が良いかと思います。 (この目的には、二分木、使う必要は全くなさそうですが)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/14 09:17

    ありがとうございます。
    無事解決できました。

    キャンセル

+1

TreeMapを使って見たらどうですか?
TreeMap

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/10 12:30

    二分探索木で探す、という課題なのでおそらく使えないです。
    でも確かにTreeMapを使うと楽そうですね!
    ありがとうございます。

    キャンセル

  • 2018/05/10 22:07

    TreeMapも二分探索木なのですがダメなのでしょうか?

    キャンセル

  • 2018/05/10 22:13

    自分で作れってことでは?

    キャンセル

  • 2018/05/10 22:46

    なるほど

    キャンセル

+1

まず、この辺から、

1)テキスト内の名前と人数を読み込む
2)それらを二分木でソートする

メソッド BinaryTree() の定義が不適切かと。
やり方は色々ですが、ここで、上記の 2つを同時に行えます。

宣言: private Node BinaryTree(Scanner inputFile)
で、処理としては、
1) inputFileから、一行づつ読み込み。
2) 名前と人数に分け、 Node を作成。
3) 最初のNodeは、先頭Nodeとし、これを元に、ソートすみ2分木を作成。
4) 2行目以降は、先頭Nodeから、人数の大小判定で、Left/Right に振り分ける。
5) ファイルの最後まで、繰り返す。
6) 先頭Node を返す。
となります。 具体的処理は、さすがに一瞬ではできません。

呼び出し側も、

Node root = BinaryTree(inputFile);

となり、ソート済み 2分木ができると思います。

あと、

File myfile = new File(" names.txt ");

ファイル名の前後に空白がありますが、良かった? ファイル名も 下には "name.text" となっていますが、どちらが正しいのでしょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/11 12:41 編集

    詳しくわかりやすい説明ありがとうございます!
    私が別のクラスに示したNode クラスは同クラス内のBinaryTreeメソッド内に書くということでしょうか?

    それからname.txtの間違いです。統一しました。ご指摘ありがとうございます。

    キャンセル

関連した質問

  • 受付中

    初歩段階プログラミング

    お世話になります。 使用言語はJavaです。 プログラム中にある名前を全て出力するプログラムを作りたいのですが 初心者でうまく組む事ができません。 条件 このプログラムでの"名前

  • 受付中

    csvの抽出条件について質問です

    csvファイルの読み込みにキーボード入力をした文字と一致するものを抽出させるプログラムをつくっています。 ただ読み込むだけならできるのですが、それに条件をつけると読み込めなくなりま

  • 解決済

    ほぼ同じ処理のメソッド化

    お世話になります。 メソッド化について質問があり、ご教授いただければと思います。 処理が全く同じものをメソッド化にすることはできるのですが、 少し、変数名や値が異なるもの

  • 受付中

    社員情報のプログラム

    社員情報のプログラム (JAVA) プログラの機能 (1)社員情報の追加 入力項目としては、社員番号、氏名(性、名)、生年月日(年、月、日) (3)で読み込んだ情報を追加する仕

  • 受付中

    Javaの質問です。テキストファイルのデータを上書き(部分的に削除)したいです。お力をお貸しください...

    初めて利用させていただきます。 現在私は、テキストファイルを用いるJavaの勉強をしております。 テキストファイルに、コンソールで入力した「name」「job」「sex」を

  • 受付中

    ファイルのコピー

    Java開発初心者です。 ファイルのコピーを行うコードを書いています。 FileInputStreamとFileOutputStreamを使って、 コピーしたいファイ

  • 解決済

    javaでデータを読み込んでソートしたいのですがうまく来ません

    コンパイルするとエラーになって 「シンボルが見つかりません」と表示されます。 他にも問題があれば教えてください import java.io.File; import

  • 解決済

    会員情報システム(Java)での作り方

    javaで会員情報システムのようなものを作りたいです。 下記の実行結果(コマンドプロンプトで実行)になるような、登録プログラムを作成したいのですが、作成方法が分かりませんので、教

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

  • Java

    14141questions

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