无法确定链表中的年份范围

时间:2014-11-16 23:55:30

标签: java singly-linked-list

大家好,我无法实现这个特殊问题。每次我添加订阅列表检查我是否需要更新" minYear"和" maxYear"。以后使用" minYear"和" maxYear"检查所请求的订阅期是否有效。基本上我试图确定订阅链接列表的年份范围。

Class SubscriptionYear:首先读取特定国家/地区的年份和细胞数据。这是从文件中读取的。它包含当年的年份和统计数据。

以下是我的SubscriptionYear代码:

public class SubscriptionYear {

private int year;
private double subscriptions;
SubscriptionYear next;

//stores the year and it's statistical data.
public SubscriptionYear(int year,double subscriptions)
{
    setYear(year);
    setSubscription(subscriptions);
    this.next = null;
}
//sets the year
public void setYear(int Year)
{
    this.year= Year;
}
//sets the cellular data.
public void setSubscription(double value)
{
    this.subscriptions = value;
}
public int getYear()
{
    return year;
}   
 //returns the stat data
public double getSubscription()
{
    return subscriptions;
}
public String toString()
{
    return "Number of Subscriptions: "+subscriptions;
}
//sets the node
public void setNode(SubscriptionYear next)
{
    this.next = next;
}
public SubscriptionYear getNext()
{
    return this.next;
}
}

班级国家: 这将读取国家/地区名称,并充当存储年份和统计数据的对象节点SubscripitpnYear的容器。它具有变量字段minYear和maxYear,用于检查订阅何时添加到列表中(如果需要更新)。使用minYear和maxYear检查请求的订阅是否有效。这是我在列表中添加SusbcriptionYear时无法实现的地方我如何检查是否需要更新minYear和maxYear?并使用minYear和maxYear来检查订阅是否有效?

我的班级国家:

public class Country  {

//variable fields.
private String countryNames;
private SubscriptionYear subscriptions;
private int minYear;
private int maxYear;

public Country(String country)
{
    this.countryNames = country;
    this.subscriptions = null;
    this.maxYear = 0;
    this.minYear = 9999;

}
//adds the subscription.
public void addSubscriptionYear(int year, double subscription)
{
    SubscriptionYear newNode = new SubscriptionYear(year, subscription);
    if(this.isEmpty())
    {
        newNode.setNode(subscriptions);
        subscriptions = newNode;
    }
    else{
        SubscriptionYear current = subscriptions;
        while(current.getNext()!=null)
        {
            current = current.getNext();
        }
        current.setNode(newNode);
    }
}

//need help implementing this function
public void update(int minYear, int maxYear)
{

}

//overrides the toString method and prints out the countries.
public String toString()
{
    String result="";
    result += "\n"+this.countryNames;
    SubscriptionYear current = subscriptions;
    while(current!=null)
    {
        result+="\t"+current.getSubscription();
        current = current.getNext();        
    }
    return result;
}
//returns countryName
 public String getName()
{
    return this.countryNames;
}
//overrides the equals method and returns country name if found
public boolean equals(Object obj)
{
    return this.countryNames.equalsIgnoreCase(((Country) obj).getName());
}
public boolean isEmpty()
{
    return (subscriptions == null);
}

1 个答案:

答案 0 :(得分:0)

-1- 嗯,这里有很多代码,但我会尝试。

你的getNext()方法让我困惑,可能是许多经验丰富的Java开发人员。在java集合(例如List)中,您可以获得迭代器(https://docs.oracle.com/javase/7/docs/api/java/util/Iterator.html)。那里" hasNext()"是一个布尔值"是否有另一个对象?)并且可以在while()控件中使用。 next()都返回下一个项使迭代器前进以指向以下项。因此...... getNext()while()中都有setNode()看起来很可疑。

您的代码使用getNext()设置" next"和setNode()来检索它。传统上(因此许多人更容易理解意图)将遵循命名约定。对于成员变量" node"这将是getNode()& SubscriptionYear current = subscriptions; while(current.getNext()!=null) { current = current.getNext(); } current.setNode(newNode);

-2- 好吧,就是说,看起来像这段代码:

newNode

遍历订阅并将SubscriptionYear放在最后。

嗯,嗯,我放弃了困惑。您使用相同的名称"订阅"作为两个截然不同的事物。在double中,它似乎是您拥有的订阅数量(为什么intCountry似乎更好)。但是,在SubscriptionYear中,它是update()的自制列表,持有第一个。

IOM,解决方案的路径包括澄清您的代码,使用更好的名称,以便您了解它的作用。

-3- 除了Country.equals()中的评论之外,你有一个具体的问题吗?也许你应该说明该方法应该做什么,提出逻辑等等。

- 其他观察:

-1- false是粗略的。如果传入的对象不属于同一类,它应返回ClassCastException,而不是public boolean equals(Object obj) { if (this==obj){return true;} if (! (obj instanceof Country)) { return false; } return this.countryNames.equalsIgnoreCase(((Country) obj).getName()); } 。更好:

equals()

-2- 你已经犯了java-developer-sin;实施hashCode()和{{1}}之一。重要的是 - 始终 - 实施两者,或两者都不实施。更多内容(读取equals()和hashCode()描述)。

https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html