首页 > 试题广场 >

数据多项排序

[编程题]数据多项排序
  • 热度指数:36 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
假设有个文件,文件的每一行是书信息数据,分4个部分用逗号(,)进行分割,格式如下

id,category,words,updatetime
id 表示书id,long类型,id不重复;
category 表示书的分类,int类型,请注意全部数据的分类只有几个
words 表示书的字数,int类型
updatetime 表示书的更新时间 ,格式为2020-02-01 23:00:00 

请编写程序对文件数据进行排序后输出id,排序优先级为: category>updatetime > words  > id , 增序排序

输入描述:
第1行数据为数据行数
第1+N行数据为书信息数据


输出描述:
请将排序后的ID输出,每行一个数据
示例1

输入

4
66,20002,25919,2020-02-16 17:35:00
63,20004,9914,2020-02-16 17:35:00
60,20001,1982,2020-02-16 17:35:00
68,20004,1693,2020-02-16 17:35:00

输出

60
66
68
63

备注:
请注意算法效率

干脆给它封装一个 Book 类 ~

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
    Book[] books = new Book[n];
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    for (int i = 0; i < n; i++) {
      String[] row = scanner.next().split(",");
      try {
        String updateTime = row[3] + " " + scanner.next();
        Book book =
            new Book(
                Long.parseLong(row[0]),
                Integer.parseInt(row[1]),
                Integer.parseInt(row[2]),
                dateFormat.parse(updateTime));
        books[i] = book;
      } catch (ParseException e) {
        e.printStackTrace();
      }
    }
    scanner.close();
    // 升序排列。字段优先级:category > updateTime > words > id
    Arrays.sort(books, (book1, book2) -> {
      if (book1.getCategory() != book2.getCategory()) {
        return book1.getCategory() - book2.getCategory();
      }
      long update1 = book1.getUpdateTime().getTime(), update2 = book2.getUpdateTime().getTime();
      if (update1 != update2) {
        return (int) (update1 - update2);
      }
      if (book1.getWords() != book2.getWords()) {
        return book1.getWords() - book2.getWords();
      }
      return (int) (book1.getId() - book2.getId());
    });
    for (int i = 0; i < n; i++) {
      System.out.println(books[i].getId());
    }
  }
}

class Book {
  private final long id;
  private final int category;
  private final int words;
  private final Date updateTime;

  public Book(long id, int category, int words, Date updateTime) {
    this.id = id;
    this.category = category;
    this.words = words;
    this.updateTime = updateTime;
  }

  public long getId() {
    return this.id;
  }

  public int getCategory() {
    return this.category;
  }

  public int getWords() {
    return this.words;
  }

  public Date getUpdateTime() {
    return this.updateTime;
  }
}
发表于 2022-03-30 23:45:59 回复(0)
我的想法是先重写一下comapareTo(),然后再用归并排序
发表于 2021-09-07 14:36:59 回复(1)