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

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

ただいまの
回答率

90.35%

  • Java

    16756questions

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

連結リストからキューと連結リストへの書き換え

解決済

回答 2

投稿 編集

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

ladyinredjes

score 9

前提・実現したいこと

連結リストを用いて、Job_ListというファイルからJob title と pageの二つのオブジェクトを入力して全てのオブジェクトと一緒にまとめを出力するプログラムを作りました。

このプログラムを連結リストではなく
連結リストを使ったキューで作成したいです。

クラスはPrint summaryとjob そしてdriverクラスです。
出来るだけ現状のコードを維持しながら
書き換えしたいのですが、どうしても大幅に変更するようになってしまいます。

該当のソースコード

PrinterクラスのaddJobsに加えてenqueueメソッドを作成して

import java.util.LinkedList;
import java.util.List;

public class Printer {
    class Job_List {
        //instances of each data that for input to the file, name is Job_List
        String title;
        int pages;
        //constructor each specified each attributes
        Job_List(String title, int pages) {
            this.title = title;
            this.pages = pages;
        }
    }

    //List instance, is empty for input data.
    private List<Job_List> jobs;
    private int jobsPerMin;

    ////constructor each specified each attributes
    Printer(int jobsPerMin) {
        jobs = new LinkedList<>();
        this.jobsPerMin = jobsPerMin;
    }

    //methods for add job title and pages
    public void addJobs(String title, int pages) {
        Job_List newJob = new Job_List(title, pages);
        jobs.add(newJob);
    }

    //methods for printing data
    public PrintSummary printData(int jobCount) {
        if(jobCount > jobs.size())
            jobCount = jobs.size();

        //if any data are not inputted, return string as below
        if(jobs.size() == 0) {
            System.out.println("No jobs present.");
            return null;
        }

        //initialize print pages
        int printPages = 0;

        //return print summary which is the number od jobs,pages and time per min. 
        for(int i=0; i<jobCount; i++) {
            Job_List job = jobs.get(0);
            printPages += job.pages;
            jobs.remove(0);
        }
        return new PrintSummary((float) jobCount/jobsPerMin, printPages, jobCount);

}
}

driverクラスのaddjob(title,pages)をenqueue(title,page)に変更すればいいことはわかるのですが
どうしてもうまくいきません。

package JobPrinter;

import java.io.File;
import java.util.Scanner;

public class Driver {
    //data instances for add or print data in file
    private static final String ADD_JOBS = "Add";
    private static final String PRINT_JOBS = "Print";

    public static void main(String[] args) {
        //Set the name of new file
        String fileName = "Job_List.txt", line, command;
        String[] commandLine;

        //instances for accumulate each print summary and default value
        int jobsPerMin = 1;
        int totalJobs = 0, totalPages = 0;
        float totalTime = 0;

        try {//Normal process
            //Create new file, name is above
            File f = new File(fileName);

            // Create a new Scanner object which will read the data from the 
            // file passed in. To check if there are more line to read from it
            // check by calling the scanner.hasNextLine() methods.
            // then, read line one by one till all line is read.

            Scanner sc = new Scanner(f);
            Printer printer = new Printer(jobsPerMin);
            PrintSummary summary;

            while(sc.hasNextLine()) {
                line = sc.nextLine();
                commandLine = line.split(" ");
                command = commandLine[0];

                //conditional branch
                switch (command) {
                    // procesing for add jobs
                    case ADD_JOBS:
                        //input job title and pages
                        String title = commandLine[1];
                        int pages = Integer.parseInt(commandLine[3]);
                        //add these data in printer 
                        printer.addJobs(title,pages);
                        //print for all of inputted title and pages
                        System.out.println("Printing: "+title);
                        System.out.println("Number of Pages: "+pages);
                        System.out.println();
                        break;
                    // processing for print jobs inputted
                    case PRINT_JOBS:
                        int printJobs = Integer.parseInt(commandLine[1]);
                        summary = printer.printData(printJobs);
                        totalJobs += summary.getPrintJobs();
                        totalPages += summary.getPrintPages();
                        totalTime += summary.getPrintTime();

                }
            }
        }//Exception handling
        catch (Exception e) {
            e.printStackTrace();
        }

        //Print summary output
        System.out.println("Print summary");
        System.out.println(totalJobs+" jobs and "+totalPages+ " printed in "+totalTime+" minutes.");
    }
}

Printsummary class

class PrintSummary {
    //data instances time,pages and jobs for print last summary
    private float printTime;
    private int printPages;
    private int printJobs;

    //constructor each specified each attributes
    public PrintSummary(float printTime, int printPages, int printJobs) {
        this.printTime = printTime;
        this.printPages = printPages;
        this.printJobs = printJobs;
    }

    //setter and getter to access from outside of this class
    public float getPrintTime() {return printTime;}
    public void setPrintTime(float printTime) {this.printTime = printTime;}

    public int getPrintPages() {return printPages;}
    public void setPrintPages(int printPages) {this.printPages = printPages;}

    public int getPrintJobs() {return printJobs;}
    public void setPrintJobs(int printJobs) {this.printJobs = printJobs;}  
}

説明が不十分でしたら申し訳ありませんが
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • jimbe

    2019/03/25 11:37 編集

    > PrinterクラスのaddJobsに加えてenqueueメソッドを作成して
    (コード略)
    > driverクラスのaddjob(title,pages)をenqueue(title,page)に変更すればいいことはわかるのですが
    どうしてもうまくいきません。

    「enqueue メソッドを作成して addjob(title,pages)をenqueue(title,page)に変更し, うまくいかなかった」コードと, 「うまくいかなかった」とはどういう状況なのか(コンパイルエラーなのか例外発生なのか異常動作なのか)のご説明もご提示願えますか.

    キャンセル

回答 2

checkベストアンサー

+1

このプログラムを連結リストではなく
連結リストを使ったキューで作成したいです。

とは, Printer クラスにある

private List<Job_List> jobs;
:
jobs = new LinkedList<>();
:
jobs.add(newJob);
:
Job_List job = jobs.get(0);
:
jobs.remove(0);


の部分のことでしょうか.

この jobs の使われ方は「連結リストを使ったキュー」に見えるのですが, どうされたいのでしょうか.


追記:

現状の jobs (LinkedList) を"より"キューらしくということでしたら, まず宣言を

private List<Job_List> jobs;

 ↓

private Queue<Job_List> jobs;


とされると良いかと思います.
これにより jobs で使えるメソッドは Queue インターフェースのもののみになりますので,
追加は(今まで通り) add で出来ますが, 取り出しは(今のとは違う) remove で行うことになります.

Job_List job = jobs.get(0);
printPages += job.pages;
jobs.remove(0);
Job_List job = jobs.remove();
printPages += job.pages;

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/25 16:04

    回答していただき、ありがとうございます。こちらとしては出来るだけPrinterクラスの現状を維持したまま最低限の編集でプログラムを連結リストからキューへ書き換えたいということです。一応現状の方法では連結リストでの作成とみなされていて、キューの使い方が不十分だと言われたので質問させていただきました。

    キャンセル

  • 2019/03/25 16:56

    どなたか(先生? 先輩? 講師?)から「LinkedList をもっとキューらしく使ってください」と言われているということですか.

    キャンセル

  • 2019/03/25 17:02

    そうですね。あくまでキューがメインでとのことでした。

    キャンセル

  • 2019/03/25 18:57

    初心者でも理解しやすい説明と最低限での修正の仕方、本当にありがとうございました。

    キャンセル

+1

リストとキューは根本的に違う思想のものです。全く違う思想のものに作り替えるのですから、大幅な変更が必要になるのは当たり前です。

また、

driverクラスのaddjob(title,pages)をenqueue(title,page)に変更すればいいことはわかるのですが
どうしてもうまくいきません。

これはおそらくDriverクラスのmainメソッド内で行っている

printer.addJobs(title,pages);


の事と思われますが、そもそもこれはDriverクラスのメソッドではなく、Printerクラスのインスタンスのメソッドを使っています。これをenqueueに書き換えたところで、Printerクラスにenqueueというメソッドは定義されていないのですから、うまくいかない(コンパイルエラーになる)のは当然です。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

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

  • Java

    16756questions

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