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

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

ただいまの
回答率

90.50%

  • Java

    13797questions

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

  • Eclipse

    1661questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Java 双方向リスト ファイル 追加する

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 172
退会済みユーザー

退会済みユーザー

Javaを利用しています。
常に昇順となる双方向リストのプログラムを作成をしたいんですが、
条件として、「数値を1個毎に、双方向リストの昇順となる位置へ追加する」「数値はファイルから入力する」が与えられています。
双方向リストは自分で実装しなくてはいけません。
ファイルから入力・出力まではできるのですが、双方向リストへの入れ方がわかりません。

 

import java.io.BufferedReader;

public static void main(String[] args){
        String file1 = "ファイル名";
        String file2 = "ファイル名";

        /*
         *     file1からデータを入力
         */

        try {
            FileReader in = new FileReader(file1);
            BufferedReader rd = new BufferedReader(in);
            String line;
            while ((line = rd.readLine()) != null) {

                            }
            rd.close();
            }
            catch (FileNotFoundException e) {
            System.out.println(file1+"ファイルが見つかりません。");
            }
            catch (IOException e) {
            System.out.println(e);
            }



        /*
         *     file2に結果を出力
         */
        try {
            BufferedReader rd =new FileReader("ファイル名"));
            FileWriter out = new FileWriter("ファイル名");
            BufferedWriter wr = new BufferedWriter(out);
            rd.readLine();
            out.plintln();
            rd.close();
            out.close();
        }
        catch (IOException e) {
            System.out.println(e);
        }
    }
}
public class Lesson{
    static DoublyListInt head; // ポインタ(前方)
    static DoublyListInt tail; // ポインタ(後方)
    static DoublyListInt ptr; // 作業用ポインタ
    static int n; // データ
    static int i; // ループカウンタ
    static int k; // 作業用カウンタ
    static int count; // 比較回数
    static Random rnd = new Random();
public static void main(String[] args) {
    head = null;
    tail = null;
    ptr = null;
    n = 10;
    count = 0;


    DoublyListInt list = new DoublyListInt(count, head);
String file1 = "ファイル名";
String file2 = "ファイル名";

//file1からデータを入力
try {
FileReader fr = new FileReader(file1);
BufferedReader br = new BufferedReader(fr);
String line;
while ((line = br.readLine()) != null) {
    for (int i = 0; i < 10; i++) {

        push(line);
    }

}
br.close();
}
catch (FileNotFoundException e) {
System.out.println(file1+"ファイルが見つかりません。");
}
catch (IOException e) {
System.out.println(e);
}

bubbleSort();
System.out.println(list);

//file2に結果を出力
try {
BufferedReader br = new BufferedReader(new FileReader(file1));
PrintWriter pr = new PrintWriter(new BufferedWriter(new FileWriter(file2)));
br.readLine();
pr.println(list);
br.close();
pr.close();
} catch (IOException e) {
System.out.println(e);
}
}

static int rand(int x) {
    int n;
    n = rnd.nextInt(x);
    return n;
}

private static void push(int p) {
    head = new DoublyListInt(p, head);
    if (tail == null) {
        tail = head;
    }
}

static void bubbleSort() {
    for (int k = 0; k < n; k++) {
        ptr = head;
        for (int j = n; k < j; j--) {
            boolean ex = compare();
            if (ex) {
                swap(ptr);
            }
            count++;
            if (ptr != null && ptr.next != null) {
                ptr = ptr.next;
            }
        }
    }
}

static boolean compare() {
    if (ptr != null && ptr.next != null) {
        int s = ptr.value;
        int t = ptr.next.value;
        if (s < t) {
            System.out.println(s + "<" + t);
            return true;
        } else {
            System.out.println(s + ">" + t);
        }

    }
    return false;
}

static void swap(DoublyListInt y) {
    DoublyListInt a = null;
    DoublyListInt b = null;

    if ((y != null) && (y.next != null)) {
        a = y;
        b = a.next;

        if (a.prev == null) {
            head = b;
        } else {
            a.prev.next = b;
        }

        if (b.next == null) {
            tail = a;
        } else {
            b.next.prev = a;
        }

        b.prev = a.prev;
        a.prev = b;

        a.next = b.next;
        b.next = a;

        System.out.println();
        System.out.println("結果");
        showdata();
        ptr = y.prev;
    }
}
static void showdata() {
    ptr = tail;
    for (int i = 0; i < n; i++) {
        if (ptr != null) {
            int v = ptr.value;
            System.out.println(i + "\t" + v);
            ptr = ptr.prev;
        }
    }
    System.out.println();
}

}


自分なりにやってみた結果

DoublyListInt を型に解決できません 
型 Lesson のメソッド push(int) は引数 (String) に適用できません

とでできました。
どこをどのように直したらいいでしょうか。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    2018/05/31 13:45

    現在のコードで起きている現象・問題を追記してください。https://teratail.com/help/question-tips#questionTips3-4

    キャンセル

  • mts10806

    2018/05/31 14:30

    インデントがかなりおかしいので調整してください。

    キャンセル

回答 2

0

(1)

DoublyListInt を型に解決できません

javaの変数は「基本型」と「参照型」に分かれます。

【Java】 基本データ型 と 参照型 の違い | 一番かんたんなJava入門

以下引用。

参照型に分類されるのは、上述の配列変数ともう一つ、クラス型変数があります。
クラス型変数というのはすなわちオブジェクトを保持する変数です。

という事ですが、

DoublyListInt を型に解決できません

↑これは「DoublyListIntクラスという型が見つからない」という事です。
DublyListIntクラスを定義しましょう。

(2)

型 Lesson のメソッド push(int) は引数 (String) に適用できません

提示されているソースコードでは呼出部分ではこう記述されています。

String line;
while ((line = br.readLine()) != null) {
    for (int i = 0; i < 10; i++) {

        push(line);

メソッド「push」の引数に与えられている引数「line」はString型の変数です。

しかし定義箇所を見ると。。。

private static void push(int p) {

メソッド「push」は引数にintを使うように定義されています。
javaのメソッドは定義されていない使い方はできないのでエラーとなっています。
定義を「push(String p)」に変えるか、使う方でメソッド「push」にint型引数を与えるように変えるか、どちらかの対応が必要です。

。。。以上、コンパイルエラーのメッセージ部分についてだけ対応方法でした。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

型 Lesson のメソッド push(int) は引数 (String) に適用できません 

は、

 push(line);

ここでしょうか。ファイルから読み込んだ文字列をそのまま、引数にしているので、型が違います。 文字列から、数値(int)に変換しましょう。

DoublyListInt を型に解決できません 

は、別の方の指摘にもあるように、DoublyListInt と言うクラスが無いという事ですね。DoublyListInt クラスをどう設計するかが、一つのポイントですね。

DoublyListInt prev;
DoublyListInt next;
int value;

は必須でしょうか。という事は、定義済みで参照を忘れているだけ?
リストへの挿入とは、push() の実装という事でしょうか?
push(int p) で、ptr.value の値と p を比較し、ptrの移動して、適切な場所に挿入すれば、良いだけと思います。 実装はそれほど難しくは無いですが、確認が大変なので、トライしてみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • Java

    13797questions

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

  • Eclipse

    1661questions

    Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。