2D对象数组

时间:2016-04-19 13:55:27

标签: java arrays sorting

我需要存储信息,包括stringintdouble,并使用它执行某些操作。所以,我制作了一个2D数组Object arr [][] = new Object [100][5];列是 - String String int(may be double/float) Double(may be float) Date用户必须自己插入所有信息,所以让我们假设我们有这样的结果:

name  author  nr   price   date
yyy    aaa    1    10.0    10.02.2013
zzz    bbb    2    20.0    11.03.2014
xxx    aaa    3    30.0    12.04.2015

所以,我尝试做以下事情:(我真的很感激任何帮助!)

  1. 用户必须插入作者姓名(第2栏),程序应该给出该作者所有商品的平均价格(从第4栏开始)。这是我的代码:

    double count=0;
    double s=0;
    System.out.println("Type author");
    scan.next();
    String auth = scan.nextLine();
    for(int i=0; i<arr.length; i++) {
        if(arr[i][1].equals(auth)){
            count++;
            s = s+(double) arr [i][3];
        }
    }
    double average = 0;
    average = s/count;
    System.out.println("Average:" + average);
    

    但是,结果会得到NaN。据我所知,问题是我的数组是一个对象,但我需要得到数字。我能想到的一件事 - 是制作这些数字的附加数组,然后计算平均数,但听起来不太好。

  2. 第二个问题 - 我需要做两种类型的2D数组排序 - 按名称(第1列)和价格(第4列)。实际上,我不知道如何做到这一点,也不知道它是否可能。我已经阅读了有关不同主题的2D列排序,但它们是关于纯字符串或纯int数组。有想法将它划分为不同的阵列,但不知道它是否值得。在解决这个问题时,我将不胜感激。

  3. 最后一个 - 如何在数组中实现日期?我的意思是,有没有办法添加它,它看起来像20.02.2013,而不是Sat Jan 02 00:00:00 GMT 2010。我可以把它变成一个简单的字符串,但我需要能够比较日期(用户插入日期,但程序显示它之后的所有行)。现在我把日期变成普通的双重型号,并比较代码如下:

    System.out.println("Insert date");
        double date1 = scan.nextDouble();
         for (int i=0; i<arr.length; i++){
             if (arr[i][4]!=null) {
             if((double)arr[i][4]>date1)
                 System.out.println(arr[i][0]);
         }
    }
    

    工作正常,但实际日期会像那项工作一样吗? 在此先感谢,我将非常感谢您解决任何问题。或者,如果我将Object数组更改为其他内容,我的生活可能会更容易?

2 个答案:

答案 0 :(得分:0)

您应该使用行列表作为数据结构。一个特定的行应该是某种元组类型(你可能想为此编写一个类)。

然后,您可以通过迭代行列表并保留与特定谓词匹配的任何行来实现选择(为此使用java 8)。

排序很简单,因为你可以通过使用一些自定义的Comparator实例来使用(行)列表的排序方法。

您可以通过迭代行列表并将列的值插入每列的特殊列表来实现列投影。然后你可以在这些列表上做平均值,sumation,等等。

为了表示日期,您应该使用标准库提供的类。您可能希望使用SimpleDateFormat实例来根据需要格式化日期。

答案 1 :(得分:0)

你应该尝试使用对象。首先创建一个类来表示您的数据模型:

public class Book {
    private String name;
    private String author;
    private int nr;
    private double price;
    private Date date;
    public Book(String name, String author, int nr, double price, Date date) {
        this.name = name;
        this.author = author;
        this.nr = nr;
        this.price = price;
        this.date = date;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    // repeat for other getters/ setters.
}

现在您已经上课了,您可以开始利用java内置的库。首先使用List来保存您的数据:

List<Book> books = new ArrayList<Book>();

可以将列表视为外部数组,并且可以将每个Book对象中的字段视为列。您现在可以添加以下条目:

books.add(new Book("yyy", "aaa", 1, 10.0, new Date(10, 02, 2013)));
books.add(new Book("zzz", "bbb", 2, 20.0, new Date(11, 03, 2014)));
books.add(new Book("xxx", "aaa", 3, 30.0, new Date(12, 04, 2015)));

让我们举一些例子:

  

用户必须插入作者姓名(第2栏),程序应该给出该作者所有商品的平均价格(来自第4栏)。

final String auth = scan.nextLine();
final double average = books.stream()
        .filter(book -> book.getAuthor().equals(auth))
        .mapToDouble(Book::getPrice)
        .average();
  

我需要做两种类型的2D数组排序 - 按名称(第1列)和价格(第4列)

books = books.stream()
        .sorted(Comparator.comparing(Book::getName)
                          .thenComparing(Book::getPrice))
        .collect(Collectors.toList());