表示以下数据类型的最佳数据结构是什么?

时间:2016-11-15 15:33:00

标签: java data-structures

我有以下格式的数据类型:

Popularity:xx
Name:xx
Author:xx
Sales:xx
Date Published: xx

我可以随意选择存储数据的方式。

我需要对数据执行一些查询,例如

  1. 今年'M'
  2. 的最佳'N'书籍是什么?
  3. 作者'X'的顶级'N'首歌的平均销售额是多少?
  4. 应该记住,可以添加更多查询。

    表示数据执行查询的不同方法是什么(用Java)?会有什么优点?

    注意:(不寻找数据库解决方案)

4 个答案:

答案 0 :(得分:1)

JDKJava DB捆绑在一起,对您的用例来说似乎完全没问题。

编辑:抱歉,我误解了这个问题,因为它似乎需要它。这就是说你应该寻找一个数据库解决方案,你只需从中查询你的书籍。

如果您确实想对内存中的数据结构执行查询,可以使用支持过滤的Apache Commons Collections

如果您确实想要使用像Vector这样的数据结构,那么您需要构建索引以提高性能。然后在索引中查找并获得所需的书。如果您知道哪些搜索是必要的,则可以对所选索引进行分组并创建一个块以便轻松搜索。基本上创建自己的cube data-structure。可能是个不错的项目。

答案 1 :(得分:1)

班级的Arraylist。创建一个包含这些变量的类,以及类变量,然后实例化所述对象的Arraylist。然后,您可以根据某些变量的值执行搜索。例如:

//replace "ClassName" with the name of the class
ArrayList<"ClassName"> array = new ArrayList<"ClassName">();
ArrayList<"ClassName"> results = new ArrayList<"ClassName">();


for("ClassName" obj:array)
{
    if(obj.getAuthor().equals("Author Name"))
    {
         results.add(obj);
    }
}

有很多方法可以对结果进行排序,包括使用Collections.sort();这似乎是最好的方式。

Sort ArrayList of custom Objects by property

编辑:我继续根据您在评论中概述的具体案例给出了一个示例。这应该可以帮到你很多。如前所述,我在大学的实验室遇到了类似的问题,这是我做的一种方式。

答案 2 :(得分:1)

您可以使用Bean来包装数据:

public class Record {

int popularity;
String name;
String author;
int sales;
int yearPublished;

public Record(int popularity, String name, String author, int sales, int yearPublished) {
    super();
    this.popularity = popularity;
    this.name = name;
    this.author = author;
    this.sales = sales;
    this.yearPublished = yearPublished;

}
//getter and setter...

public String toString(){
    return name;
}

这是查询java8的典型用法:

Record Record1 = new Record(10,"Record 1 Title","Author 1 Record",10,1990);
Record Record2 = new Record(100,"Record 2 Title","Author 2 Record",100,2010);
Record Record3 = new Record(140,"Record 3 Title","Author 3 Record",120,2000);
Record Record4 = new Record(310,"Record 4 Title","Author 1 Record",130,2010);
Record Record5 = new Record(110,"Record 5 Title","Author 5 Record",140,1987);
Record Record6 = new Record(160,"Record 6 Title","Author 1 Record",15,2010);
Record Record7 = new Record(107,"Record 7 Title","Author 1 Record",4,1980);
Record Record8 = new Record(1440,"Record 8 Title","Author 8 Record",1220,1970);
Record Record9 = new Record(1120,"Record 9 Title","Author 9 Record",1123,2010);

List<Record> Records = Arrays.asList(Record1,Record2,Record3,Record4,Record5,Record6,Record7,Record8,Record9);
//top 2 record of year 2010
int m = 2;
int year = 2010;
System.out.println(Arrays.toString(Records.stream().filter(s -> s.getYearPublished() == year).sorted((r1, r2) -> Integer.compare(r2.popularity, r1.popularity)).limit(m).toArray()));
//average top 2 record of Author 1 Record
String author= "Author 1 Record";
int n = 2;
System.out.println(Records.stream().filter(s -> author.equals(s.getAuthor())).sorted((r1, r2) -> Integer.compare(r2.popularity, r1.popularity)).limit(n).mapToInt(Record::getSales).average().getAsDouble());

打印:

[Record 9 Title, Record 4 Title]
72.5

答案 3 :(得分:0)

拥有一组对象,您可以使用stream api来收集/过滤/减少结果。没有那么多。 主要问题是不将所有对象加载到内存中,并且能够通过使用索引,反向索引从任何存储中有效地检索它们。 我想到的其中一个框架是Apache spark