如何为这个程序编写TreeMap?

时间:2014-04-16 17:34:47

标签: java treemap

我的文件pacs.txt包含:

a,b,c,d

然后我有另一个文件members.txt

sara a,c
brad d,a
tammy c,b

我必须打印出来

a sara, brad
b tammy
c sara tammy

我编写了一个尝试执行此操作的代码。我进去向TA求助,她说我非常接近我只是弄乱了我的Treemap。有人可以帮我弄清楚我做错了什么。列表A是pacsFile,列表B是membersFile。

import java.io.*;
import java.util.*;

// N O   C O M M A N D  L I N E   A R G S!
// A L L   F I L E N A M E S  M U S T  B E  H A R D C O D E D

public class Pacs
{
public static void main( String args[] ) throws Exception
{
        BufferedReader pacsFile = new BufferedReader( new FileReader( "pacs.txt" ) );
        BufferedReader membersFile = new BufferedReader( new FileReader( "members.txt" ) );
        TreeMap<String,String> Map = new TreeMap<String,String>();
        ArrayList<String> acroymn = new ArrayList<String>();
        String group;
        String people;
        while((group = pacsFile.readLine()) != null)
        {
            acroymn.add(group);
        }
        Collections.sort(acroymn);
        pacsFile.close();
        while((membersFile.ready()))
        {
            ArrayList<String> members = new ArrayList<String>();
            people = membersFile.readLine();
            String [] peoples = people.split(" ");
            members.add(peoples[0]);
            for (int i = 1; i< peoples.length; i++)
            {

                Map.put(peoples[i],peoples[0]);
            }

        }
        membersFile.close();

        for(String acro: acroymn)
        {
            String name = "";
            for(String mem: Map.keySet())
            {
                for(String S: Map.get())
                {
                    if(acro.equals(S))
                    {
                        name = name+ " " + mem;
                    }
                }
            }
            System.out.println(acro + " " + name);      


        }


} // END MAIN

} // CLASS

2 个答案:

答案 0 :(得分:1)

我认为问题在于你是如何存储数据的。最好将它存储起来:

TreeMap<String, List<String>> data = new TreeMap<String, List<String>>();

第一个文件(a,b,c,d)中的元素将成为键,第二个文件(sara,brad,tammy)中的名称将是为地图的每个条目添加的值。 / p>

最后,只需打印没有任何null值的键值对。

答案 1 :(得分:0)

当前问题

我在阅读文件中信息的方式上看到了几个问题。

阅读"pacs.txt"

首先,我觉得acronym列表只包含一个包含所有字母的元素:

while((group = pacsFile.readLine()) != null)
{
    acroymn.add(group);
}

如果文件的第一行实际上包含用逗号分隔的所有字母(如您所述),那么这只会向列表中添加一个元素:字符串"a,b,c,d"

您应该使用group.split(","),然后将其元素添加到列表中。

阅读"members.txt"

其次,似乎你在people上循环而不访问不同的索引:

for (int i = 0; i< peoples.length; i++)
{
    members.add(peoples[0]);
    Map.put(acroymn,peoples[0]);
}

您始终可以访问0。

可能的解决方案

您当前正在将一个文件的内容存储在数据结构中,将另一个文件的内容存储在另一个数据结构中,然后将所有内容放在一起。

你应该在这里关注@LuiggiMendoza的建议,并使用Map<String, List<String>。直接在流程的两个步骤中使用此结构。

以下是一些关于你可以用它做什么的提示。

阅读"pacs.txt"

使用以下方法将所有元素添加为地图的键:

map.put(element, new LinkedList<String>());

这样,即使没有人关联,您的所有密钥都将存在。此外,这会将人员列表初始化为您只需要完成的空列表。

阅读"members.txt"

对于每个人,使用以下方式获取与该行的每个键对应的列表:

List<String> list = map.get(key);

并将您的人添加到其中:

list.add(person);