在java中使用数组的数组列表

时间:2015-02-19 17:38:10

标签: java arraylist

我正在尝试创建一个散列表,它是ArrayList的数组列表(长度为100)。每个工人都有一个ID号,姓名和工资。我创建了一个大小为100的数组列表的数组列表,并希望将每个worker存储在索引IDNumber%100。例如,ID为9999的John Doe将存储在索引99处。在碰撞的情况下,如Jean Doe的ID号为19999,她将存储在数组列表中的数组列表中,也位于索引99处。当我打印出我的哈希表时,多次打印出工人信息,如下所示:

John Smith             234         65678.5
Janice Sullivan           27854        29345.75
Javier Lopez           10765         87687.1
Jill Applewood           22234         38678.0
Jake Drake            1234        22222.25
John Doe            9999        100000.0
Jean Doe           19999        100001.0
John Smith             234         65678.5
Ect.

我的打印方法有问题,还是我没有正确创建哈希表?

import java.util.ArrayList;

public class PartnerHash
{
    public static void main(String[]args)
    {
        Worker workers[] = {new Worker("John Smith", 65678.50, 234),
                new Worker ("Janice Sullivan", 29345.75, 27854),
                new Worker ("Javier Lopez", 87687.10, 10765),
                new Worker ("Jill Applewood", 38678.00, 22234),
                new Worker ("Jake Drake", 22222.25, 1234),
                new Worker ("John Doe", 100000.00, 9999),
                new Worker ("Jean Doe", 100001.00, 19999)};

        ArrayList<ArrayList<Worker>>    list =populateHashTable(workers);
        print(list);
    }
    private static void print(ArrayList<ArrayList<Worker>> list) 
    {
        for (int i=0; i<list.size(); i++)
        {
            if (list.get(i)!=null)
                for (int j=0; j<list.get(i).size(); j++)
                {
                    if (list.get(i).get(j)!=null)
                        {
                            System.out.print(list.get(i).get(j).getName());
                            System.out.printf("%16s",list.get(i).get(j).getIDNum());
                            System.out.printf("%16s",list.get(i).get(j).getSalary());
                            System.out.println("");
                        }
                }
        }
    }
    public static ArrayList<ArrayList<Worker>> populateHashTable(Worker [] workers) 
    {
        ArrayList<ArrayList<Worker>> list = new ArrayList<ArrayList<Worker>>(100);
        ArrayList<Worker> sublist = new ArrayList<Worker>();
        for (int j=0; j<100; j++)
            list.add(sublist);
        for (int i=0; i<workers.length; i++)
        {
            int index =workers[i].getIDNum()%100;
            ArrayList target=list.get(index);
            target.add(workers[i]);
        }
        return list;
    }
}

2 个答案:

答案 0 :(得分:0)

问题

所以看一下代码的这一部分:

ArrayList<Worker> sublist = new ArrayList<Worker>();
    for (int j=0; j<100; j++)
        list.add(sublist);

如果你考虑一下这是做什么的,基本上你已经创建了 一个 子列表,然后添加 完全相同 子列表100次到您的列表。

然后当你进入下一个循环

for (int i=0; i<workers.length; i++)
{
    int index =workers[i].getIDNum()%100;
    ArrayList target=list.get(index);
    target.add(workers[i]);
}
return list;

您实际上是将每位员工添加到sublist workers.length次。这就是为什么当你去&#34;打印&#34;你看到的阵列:

  

当我打印出我的哈希表时多次打印出工人信息

(顺便说一下,它不是哈希表..)

解决方案

如果您确实想继续使用ArrayList<ArrayList<Worker>>,请为每个子列表创建 arraylist:

//ArrayList<Worker> sublist = new ArrayList<Worker>(); <- get rid of this
    for (int j=0; j<100; j++)
        list.add(new ArrayList<Worker>());

这样,当您添加工作者时,实际上会获得不同的子列表实例。

或者您可以考虑使用内置HashMap<Integer, Worker>,将工作人员ID作为关键字,然后使用Worker作为值

答案 1 :(得分:0)

您将相同的子列表添加到主列表100次,因此您添加的每个工作人员似乎都会添加到每个哈希“#”桶中。更改填充方法中的代码,如下所示:

// ArrayList<Worker> sublist = new ArrayList<>(); remove this line!
for (int j=0; j<100; j++) {
    list.add(new ArrayList<Worker>());
}