麻烦读取参考java数组中的变量

时间:2014-10-17 18:53:04

标签: java

我正在读取一个csv文件,该文件读取国家/地区名称并在特定年份获取特定国家/地区的订阅数据。下面是一个csv示例文件:

CountryName,1960,1961,1962,1963,1964,1965,1966,1967,1968,1969,1970,1971,1972,1973,1974,1975,1976,1977,1978,1979,1980,1981,1982,1983,1984,1985,1986,1987,1988,1989,1990,1991,1992,1993,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012
Aruba,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.029310471,0,0,2.138784453,3.605985937,3.98141538,6.16435217,13.48254011,16.50927821,57.05427692,65.05605558,72.10431377,99.64250268,103.3849507,108.1325002,112.2180618,119.2038996,126.2103374,129.72824,0,131.8565401               
Andorra,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.307211734,1.278625641,1.250259142,4.424155104,8.538444783,13.44671556,22.12730607,32.14530928,35.99902139,43.27794118,45.77115817,68.60251444,73.82494308,79.48487497,84.27763597,78.1171579,80.2836099,82.06181111,84.06818386,83.53432222,81.50204186                         
Afghanistan,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.112598381,0.865196277,2.498055472,4.826865367,9.833164022,17.71624331,29.22037376,37.89493697,45.77817474,60.32631999,60.35299258

我能够正确读取文件。我创建了2个类。 1个名为class subscriptionYear的类,它读取我调用int year的年份,以及读取每个统计数据的变量double subscription。第二节叫Class Country。它读取名为String countryNames的国家和名为SubscriptionYear[] subscriptions的1d数组,其中包含该国家/地区的所有订阅数据。我在类国家/地区有两个名为addSubscriptionYear(int year, double countryData)的方法,它们读取的数据我遵循名为class TestCountry的测试类的指导原则。我的程序读取文件但输出错误的总和。基本上它只读取2012年,而不是1960年到2012年之间的整个时期。因此,当我做总和时,它只输出2012年的统计数据,而不是1960年至2012年的全部总和。我的问题似乎来自{{1}将年份和数据插入addSubscriptionYear method,但它只读取2012年,而不是从1960年到2012年我尝试调试时的整个时期。我必须遵循class Subscription的指导原则,因为这是要求。但是我的函数方法TestCountry class就是问题所在。有人可以帮助我,或者一些提示如何将每年和数据存储在对象数组中。以下是我的文件

类订阅:

addSubscriptionYear()

班级国家:

public class SubscriptionYear {

private int year;
private double subscriptions;

public SubscriptionYear(int year,double subscriptions)
{
    //this.year = year;
    //this.subscriptions = subscriptions;
    setYear(year);
    setSubscription(subscriptions);
}
public void setYear(int Year)
{
    this.year= Year;
}
public void setSubscription(double value)
{
    this.subscriptions = value;
}
public int getYear()
{
    return year;
}
public double getSubscription()
{
    return subscriptions;
}
public String toString()
{
    return "Number of Subscriptions: "+subscriptions;
}
}

Tesfile:

public class Country {

private String countryNames;
private SubscriptionYear[] subscriptions;
private int size;

public Country(String country, int arraylength)
{
    this.countryNames = country;
    this.size = arraylength;
    subscriptions = new SubscriptionYear[size];
}
 //seems to be where i am having the problem
 //only reads 2012 and not 1960. seems to be my problem
public void addSubscriptionYear(int year, double subscription)
{
    for(int i=0;i<subscriptions.length;i++)
    {
        subscriptions[i]= new SubscriptionYear(year, subscription);
    }
        //System.out.print(subscriptions[0].getYear()+"\t");

}
public double getNumSubscriptionsForPeriod(int start, int end)
{
    double sum = 0;
    int head = subscriptions[0].getYear()-start;
    int tail = end-start;
    if(head>=0&&end<subscriptions.length)/check if out of bounds.
    {
    for(int k=head;k<=tail;k++)
    {
        sum += subscriptions[k].getSubscription();
    }
   } else{ sum =-1;}
   return sum;
}
public String toString()
{
    System.out.print(countryNames+"\t");
    for(SubscriptionYear s: subscriptions)
    {
        //System.out.print(countryNames+"\t");
        System.out.print(s.getSubscription()+"\t");
    }
    System.out.println();
    return  "";
}
}

它为aruba输出131.63而不是1170.50。它基本上只读取2012年的统计数据而不是整个1960年到2012年的统计数据。我需要帮助修复类Country中的addSubscriptionYear方法。

1 个答案:

答案 0 :(得分:1)

您只保留最后一个日期,因为您在addSubscriptionYear()方法中放置了一个for循环并且覆盖了所有先前的值,因此请删除for循环,并在表中跟踪当前索引通过在您的类Country中添加和添加int,每次调用方法addSubscriptionYear()

时都会增加
int lastPos = 0;
public void addSubscriptionYear(int year, double subscription)
{
    subscriptions[lastPos]= new SubscriptionYear(year, subscription);
    lastPos++;
}