簡體   English   中英

用於CSV文件處理的Java數據類型

[英]Java Data Type for CSV File processing

我正在解決這個問題,找到一個合適的數據類型,但我不能解決哪一個是最有效和簡單的方法來編程,而不使用任何第三方庫:

問題:考慮CSV文件中自1990年以來每月給出的N個公司的股價。 文件格式如下,第一行為標題。

Year,Month,Company A, Company B,Company C, .............Company N 
1990, Jan, 10, 15, 20, , ..........,50 
1990, Feb, 10, 15, 20, , ..........,50 
. 
. 
. 

2013年9月,50日,10日,15日............ 500

輸出:股票價格最高的每個公司年月的清單。

我考慮過使用樹木,Hashmap,列表,但我無法完成THE ONE解決方案。 到目前為止,我是Java的新手,有幾周的Java編碼經驗。 任何形式的偽代碼,程序或使用什么數據類型的幫助都是值得贊賞的。

好的,有無數種方法可以做到這一點,但我最喜歡的方法是創建一個Company類來持有Company.name,Company.month,Company.year,Company.price並使用Map添加數據。 然后,添加邏輯將檢查地圖以查看是否存在具有相同名稱的公司,如果不存在或新公司價格較大,則只需將新公司數據放入具有公司名稱作為關鍵字的地圖中。 好吧,下面的代碼只是為了演示目的,我會使用eclipse生成getters / setter並使用那些代替直接成員變量,就像演示一樣。 此演示缺少從CSV文件中讀取和收集公司數據。

CompanyLoader.java

package org.cnci.poc;

import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class CompanyLoader {
   private List<Company> companies;
   private int lastReadIdx=0;

   public CompanyLoader() {
   }

   // Simply read the CSV and return the next set of company data
   private Company getNextCompanyData() {
      if (companies == null) {
         lastReadIdx = 0;
         try {
            loadCompanies();
         } catch (Exception e) {
         }
      }
      if (companies == null) return null;
      if (lastReadIdx < companies.size()) return companies.get(lastReadIdx++);
      return null;
   }

   public void loadCompanies() throws Exception {
      Scanner s = null;
      try {
         companies = new ArrayList<Company>();
         File f = new File("test.csv");
         System.out.println(f.getAbsolutePath());
         s = new Scanner(new FileInputStream(f));
         String[] headers = readLine(s);
         System.out.println("headers: " + Arrays.toString(headers));
         if (headers != null && headers.length >0) {
            String[] data = null;
            while ((data = readLine(s)) != null) {
               System.out.println("data: " + Arrays.toString(data));
               if (data.length != headers.length) {
                  companies = null;
                  throw new Exception("Invalid Data - headers count " + headers.length + " does not match with data count "+data.length);
               }
               String year = data[0];
               String month = data[1];
               for (int x=2; x<data.length; x++) {
                  double price = new Double(data[x]).doubleValue();
                  Company company = new Company(headers[x], year, month, price);
                  companies.add(company);
               }
            }
         }
      } finally {
         if (s != null) s.close();
      }
   }

   private String[] readLine(Scanner s) {
      if (s.hasNextLine()) {
         return s.nextLine().trim().split(",");
      }
      return null;
   }

   public void processCompanies() {
      Map<String, Company> companies = new HashMap<String, Company>();
      Company newCompany = null;

      // repeat until all company data processed from CSV file
      while ((newCompany = getNextCompanyData()) != null) {
         Company oldCompany = companies.get(newCompany.getName());
         if (oldCompany == null || newCompany.getPrice() > oldCompany.getPrice())
            companies.put(newCompany.getName(), newCompany);
      }
      // Done, now display the winners
      for (String name : companies.keySet()) {
         Company company = companies.get(name);
         System.out.println(company.getName() + " highest price " + company.getPrice() + " is " + company.getMonth() + " " + company.getYear());
      }
   }

   public static void main(String[] args) {
      CompanyLoader loader = new CompanyLoader();
      loader.processCompanies();
   }
}

Company.java

package org.cnci.poc;

public class Company {
   private String name;
   private String year;
   private String month;
   private double price;

   public Company(String name, String year, String month, double price) {
      super();
      this.name = name;
      this.year = year;
      this.month = month;
      this.price = price;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public String getYear() {
      return year;
   }
   public void setYear(String year) {
      this.year = year;
   }
   public String getMonth() {
      return month;
   }
   public void setMonth(String month) {
      this.month = month;
   }
   public double getPrice() {
      return price;
   }
   public void setPrice(double price) {
      this.price = price;
   }

   @Override
   public String toString() {
      return "Company [name=" + name + ", year=" + year + ", month=" + month + ", price=" + price + "]";
   }
}

test.csv

Year,Month,Company A,Company B,Company C,Company D,Company N 
1990, Jan, 10, 15, 20, 31, 50 
1990, Feb, 11, 14, 21, 30, 51 

輸出:

C:\Projects\Java\POC\test.csv
headers: [Year, Month, Company A,  Company B, Company C,  Company D,  Company N]
data: [1990,  Jan,  10,  15,  20,  31,  50]
data: [1990,  Feb,  11,  14,  21,  30,  51]
Company B highest price 15.0 is  Jan 1990
Company C highest price 21.0 is  Feb 1990
Company N highest price 51.0 is  Feb 1990
Company A highest price 11.0 is  Feb 1990
Company D highest price 31.0 is  Jan 1990

好 。 你應該把每一行都讀成一個字符串。 然后,對於標題之后的每一行,您可以遵循以下幾種策略之一:創建日期數組,以及每個公司股票價格的浮點數組

或者創建一個公司對象,其本身具有日期和股票價格的數組)

您將需要在Company對象中使用“addDatePrice(date,price)方法。您可以在標題csv行中創建正確數量的公司(並將公司對象賦予nam)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM