【问题标题】:JAVA: HashMap<String, ArrayList> - How can I associate the values?JAVA:HashMap<String, ArrayList> - 如何关联这些值?
【发布时间】:2014-03-14 02:51:36
【问题描述】:

我很难理解我正在尝试实现的哈希图。基本前提是我在 txt 文件中有一个站点列表,每个站点之间都有“连接”。类似的东西;

连接:Station1 Station2

连接:Station4 Station6

我有几种方法,它们会将站点名称添加为字符串,然后将其“已连接”站点存储在一个数组列表中,然后我可以稍后检索它以显示“站点 4:已连接到站点 6”等等。

下面我关心的两种方法是“添加站”和“添加连接”的方法 我已经设置了它,所以 Hashmap“站”应该包含一个 String > Arraylist 关系。我的想法是“字符串”将存储电台名称,然后数组列表“connectedstations”将存储它连接到的所有电台,我只是不知道如何创建关联?我在使用 Key 之前写过一些,但我似乎无法在这里工作!

任何帮助将不胜感激!谢谢

public class MyNetwork implements Network {

//The Hashmap of type String, Arraylist. The String holding the 
//station name, and the arraylist holding the stations connected to it

HashMap<String, ArrayList> stations = new HashMap<>();

//the arraylist to hold the connected stations

ArrayList<String> connectedstations = new ArrayList<>();



@Override
public void addStation(String station) {

    //adds a station to the hashmap, pointing to a CURRENTLY empty
    //arraylist "connectedstations"

          stations.put(station,connectedstations);

}

@Override
public void addConnection(String fromStation, String toStation) {

   /**
 * Add a direct connection from one station to another.
 * @pre both fromStation and toStation have already been added by the method
 * addStation.
 * @param fromStation The station from which the connection begins. 
 * @param toStation The station at which the connection ends.
 */


}

【问题讨论】:

  • 我看到这么多固执的人试图创建列表而不是创建对象,他们为弄清逻辑而绞尽脑汁花了好几个小时。然后,如果您需要更换一件,则必须更换所有件。只需创建一个包含 Station 对象列表的 Connection 对象,您的生活就会变得如此轻松。
  • @John:在这种情况下,逻辑仍然是完全相同的:您仍然需要从地图中获取 Connection 对象(而不是 List),并向其中添加一个站点(而不是将其添加到列表中)。将站点列表命名为“连接”对我来说看起来更加混乱。地图中应该作为值的是一个 Station 对象,具有一个 name 属性和一个连接的站点列表。并且逻辑仍然是相同的。
  • @JBNizet 你误解了我的评论。一个连接不是一个站列表。一个连接有一个站列表。我从未声称逻辑会改变。我声称逻辑会更容易理解和维护。例如,如果 Station 无法连接到自身,您可以使用 this 引用进行检查。您可以将类似的约束添加到 Object,而不是尝试对列表施加限制。我意识到“更容易理解”是主观的,这就是为什么我把我的评论作为一个简单的评论。
  • 但是连接不应该有电台列表。连接是源站和目标站之间的链接。我同意你的观点,但我的观点是,将包含站点列表的对象命名为“连接”比简单地使用列表更令人困惑。正如我所说,地图中应该是一个 Station 对象,带有名称和连接的站点列表,实际上,还有允许检查约束的方法。
  • @JBNizet 连接就是链接。一个连接有两个端点。我知道您认为这太令人困惑了,但事实并非如此。

标签: java arrays arraylist hashmap keyset


【解决方案1】:

您当前的代码为添加到地图的所有车站添加了相同的连接列表。这是不对的,因为每个站点都有自己的连接列表。

addStation() 应该在地图上添加一个站点,并以一个新的空列表作为值。

addConnection() 应获取与地图中的车站相关联的连接列表,并应将车站添加到此列表中。

只是一些补充说明:

  • 地图的类型应该是Map&lt;String, List&lt;String&gt;&gt;
  • 您可以使用具有 Multimaps 的 Guava,使此过程更容易:无需关心初始化空列表,能够直接添加到 multimap,而不是从列表中取出列表并添加到列表中。

【讨论】:

  • 对不起,之前应该提到过。这是一个修订练习,所以我在实施它的方式上相当受限。方法标题和@param 位是我们开始使用的,这就是我们必须实现它的方式。我正在使用 NetBeans,我不知道 Guava 是什么。您是否建议在“addstation”方法中,我当前指向一个空的arraylist“连接的站点”,我应该每次都创建一个新的arraylist?我似乎无法在我的脑海中得到这个,我把我的头骨撞在墙上,直到脑震荡!
  • 是的,这就是我的建议。对于每个站点,您需要一份不同于所有其他列表的列表。因此,如果您在代码中创建一个列表,那是不对的。仅供参考:Guava 是一个流行的 Java 库。谷歌它,你会找到它。顺便说一句,您使用 NetBeans 的事实是无关紧要的。 Java 代码就是 Java 代码,无论您使用什么工具来创建它。
  • 好的,我不确定我现在是不是又走错了方向,但这对 addstations 有用吗? public void addStation(String station) {' List connectedStations =stations.get(station);` if (connectedStations == null) { connectedStations = new ArrayList&lt;String&gt;(); connectedStations.add(station); } stations.put(station, connectedStations); }
  • 重新阅读我的答案。您只需在地图中放置一个空列表:public void addStation(String station) {stations.put(station, new ArrayList&lt;String&gt;());}。您不希望该站与自身连接。那么为什么要将电台添加到已连接电台列表中呢?
  • 好吧,我知道你了,我还是像往常一样想多了!所以现在我有一个存储为字符串的站,每个站都有一个空的数组列表,其中将包含其连接的站。所以保持目前的状态,我将如何创建一个站和它的连接站之间的关联?新的 Arraylist 位没有名称,那么如何在代码中引用它?这是我需要设置键位的地方吗?抱歉,我知道这对你来说一定是第二天性,但对我来说这是残酷的一步!
猜你喜欢
  • 2016-05-15
  • 2016-08-23
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多