0

コンパレーターを日付でソートする際に問題が発生しています。日付形式は「dd/MM/yyyy」にする必要があるため、SQL データベースから情報を呼び出し、次のようにして文字列を日付に変換します。

  public void setDeadlineDate(String deadDate) throws ParseException {
        this.d_date = deadDate;
        //convert strings to dates
        formatter = new SimpleDateFormat("dd/MM/yyyy");
        convertedDeadlineDate = (Date)formatter.parse(deadDate);
    }

次に、以下の get メソッドを作成して、コンパレータを呼び出します。例を挙げる必要がありますが、奇妙な日付が場違いであり、比較が正しくないという点で、常に矛盾があります。

例 1:

  @Override
    public int compare(JobRequest j1, JobRequest j2) {

        if (j1.getConvertedDeadlineDate().before(j2.getConvertedDeadlineDate())) {
            return -1;
        } else if (j1.getConvertedDeadlineDate().after(j2.getConvertedDeadlineDate())) {
            return 1;
        } 
        else {
            return 0;
        }
    } 

例 2:

public int compare(JobRequest j1, JobRequest j2){
return j1.getConvertedDeadlineDate().compareTo(j2.getConvertedDeadlineDate());
}

これらの例の両方で問題が発生し、priorityqueue の締切日が希望どおりに正しい順序で表示されません。私のデータベースでは、日付関数を使用して英語形式にすることができないため、2012 年 12 月 1 日、「01/12/2012」という形式で varchar として保存されます。

文字列を変換してから比較するためのより良い方法ですか、それとも何か不足していますか?

ありがとう

編集:注文された日付の出力取得:

  • 2011/05/04
  • 2012/12/16
  • 2012/06/18
  • 2013/12/17
  • 2013/12/17
  • 2013/12/16
  • 2013/12/17
  • 2012/08/14
  • 2013/12/19

PriortyQueue を宣言する場所:

private Comparator<JobRequest> comparator = new JobQueueComparator(); //calls my comparator
    private PriorityQueue< JobRequest> scheduledJobs = new PriorityQueue<JobRequest>(100, comparator);

    public void addJob(JobRequest job) {
        // now add job to priority queue
        scheduledJobs.add(job); // add jobs from the resultset into queue
    }  

scheduleJobs.add(job) は、結果セットからキューに入力するだけで、データベース内のすべてのフィールドが読み取られるまでキューに追加し続けます。以下を参照してください

public void populateQueueFromDB() {
        // create priority queue
        try {
            String url = "jdbc:mysql://localhost:3306/project";
            Connection conn = DriverManager.getConnection(url, "root", "nbuser");

            PreparedStatement stmt = conn.prepareStatement("SELECT user_id,s_date,e_date,d_date,department,projectname,projectapplication,priority,cores,disk_space,analysis FROM booking");
            ResultSet rs;
            rs = stmt.executeQuery();


            //List<JobRequest> jobList = new ArrayList<JobRequest>();

            while (rs.next()) {
                JobRequest job = new JobRequest();
                User user = new User();
                user.setUserID(rs.getString("user_id"));
                job.setUserID(user.getUserID()); // changes the /user id to the job.setuser id so can call for my queue print.
                job.setStartDate(rs.getString("s_date"));
                job.setEndDate(rs.getString("e_date"));
                job.setDeadlineDate(rs.getString("d_date"));
                job.setDepartment(rs.getString("department"));
                job.setProjectName(rs.getString("projectname"));
                job.setProjectApplication(rs.getString("projectapplication"));
                job.setPriority(rs.getInt("priority"));
                job.setCores(rs.getInt("cores"));
                job.setDiskSpace(rs.getInt("disk_space"));
                job.setAnalysis(rs.getString("analysis"));

                schedulerPriorityQueue.addJob( job );

            }
            schedulerPriorityQueue.printQueue();

            conn.close();

        } catch (Exception e) {
            System.err.println("Got an exception! ");
            System.err.println(e.getMessage());
        }

    }

}

印刷キュー:

public void printQueue() {
        for (JobRequest jr : scheduledJobs) {

            System.out.print(jr.getUserID() + "-->");
            System.out.print(jr.getStartDate() + "--START-->");
            System.out.print(jr.getEndDate() + "---END-->");
            System.out.print(jr.getDeadDate() + "--DROP-->");
            System.out.print(jr.getDepartment() + "-->");
            System.out.print(jr.getProjectName() + "-->");
            System.out.print(jr.getProjectApplication() + "-->");
            System.out.print(jr.getPriority() + "--PRIORITY-->");
            System.out.print(jr.getCores() + "-->");
            System.out.print(jr.getDiskSpace() + "-->");
            System.out.println(jr.getAnaylsis());

        }
    }
4

3 に答える 3

2

あなたがするとき:for (JobRequest jr : scheduledJobs) { ...あなたは実際に暗黙を使用しています。Iteratorこれは、アイテムが優先度(コンパレータによって定義された)の順序で返されることを保証しません。

上記のように、ドキュメントには次のように記載されています。

このクラスとその反復子は、 Collection および Iterator インターフェースのすべてのオプション メソッドを実装します。メソッド iterator() で提供される Iterator は、優先キューの要素を特定の順序でトラバースすることは保証されていません。順序付けされたトラバーサルが必要な場合は、Arrays.sort(pq.toArray()) の使用を検討してください。

つまり、キュー内のジョブの順序とイテレータの順序は必ずしも同じではありません。

ジョブを一覧表示するだけの場合Arrays.sortは、ドキュメントに記載されている方法を使用してください。

PriorityQueue が機能していることを確認したい場合は、次のようにして、それを 1 つとして使用する必要があります。

while(!scheduledJobs.isEmpty()) {
     ... = scheduledJobs.poll();
     //print, do whatever
}

これにより要素がキューから削除されることに注意してください。テスト目的でのみ使用するか、必要に応じて実際にジョブを処理する必要があります。ただし、これにより、実際の優先順位で日付が表示されるはずです。

PriorityQueueをどのように使用すべきかについて、いくつかの混乱があるように私には思えます。通常のユースケースは次のようになります。

  • 要素をキューに追加する
  • キューで「ジョブ」(各要素)を処理するメソッドを定義します
  • キューが空でない間は、poll(最小のものを返す) を使用して各要素を取得し、それに対して必要なことは何でも行います。
于 2013-02-18T14:39:30.040 に答える
0

PriorityQueue のドキュメントには、

メソッド iterator() で提供される Iterator は、特定の順序で優先度キューの要素をトラバースすることは保証されていません。順序付けされたトラバーサルが必要な場合は、Arrays.sort(pq.toArray()) の使用を検討してください。

. http://docs.oracle.com/javase/6/docs/api/java/util/PriorityQueue.html

于 2013-02-18T14:26:44.367 に答える
0

これは私にとって完璧に機能します:

public class JobRequest implements Comparable<JobRequest> {

    static final DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
    Date convertedDeadlineDate;

    Date getConvertedDeadlineDate() {
        return convertedDeadlineDate;
    }

    public JobRequest(String deadDate) {
        try {
            convertedDeadlineDate = (Date) formatter.parse(deadDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    @Override
    public int compareTo(JobRequest j) {
        return this.getConvertedDeadlineDate().compareTo(
                j.getConvertedDeadlineDate());
    }

    public static void main(String[] args) {
        List<JobRequest> list = new ArrayList<>();
        list.add(new JobRequest("10/10/2010"));
        list.add(new JobRequest("09/09/2009"));
        list.add(new JobRequest("11/11/2011"));
        list.add(new JobRequest("08/08/2008"));

        Collections.sort(list);

        for (JobRequest j : list) {
            System.out.println(formatter.format(j.getConvertedDeadlineDate()));
        }
    }

}

出力は次のようになります。

08/08/2008
09/09/2009
10/10/2010
11/11/2011
于 2013-02-18T14:33:02.990 に答える