在 java 中使用数组列表
Using an array list of arrays in java
我正在尝试创建一个散列 table,它是 ArrayList 的数组列表(长度为 100)。每个工人都有一个身份证号码、姓名和工资。我创建了一个大小为 100 的数组列表,并希望将每个工作人员存储在索引 IDNumber%100 处。例如,ID 为 9999 的 John Doe 将存储在索引 99 处。在发生冲突的情况下,如 ID 号为 19999 的 Jean Doe,她将存储在数组列表中的数组列表中,索引也为 99 . 当我打印出我的散列时 table 像这样多次打印出工人信息:
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.
我的打印方法有问题还是我没有正确创建哈希 [=17=]?
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;
}
}
问题
所以看这部分代码:
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
次。这就是为什么当您转到 "print" 您的数组时,您会看到:
When I print out my hash table prints out the worker information multiple time
(顺便说一句,这不是哈希表..)
解决方案
如果你真的想继续使用 ArrayList<ArrayList<Worker>>
然后为每个子列表创建一个 new 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
作为值
您将同一个子列表添加到主列表中 100 次,因此您添加的每个工作人员似乎都被添加到每个散列中 'bucket'。像这样更改填充方法中的代码:
// ArrayList<Worker> sublist = new ArrayList<>(); remove this line!
for (int j=0; j<100; j++) {
list.add(new ArrayList<Worker>());
}
我正在尝试创建一个散列 table,它是 ArrayList 的数组列表(长度为 100)。每个工人都有一个身份证号码、姓名和工资。我创建了一个大小为 100 的数组列表,并希望将每个工作人员存储在索引 IDNumber%100 处。例如,ID 为 9999 的 John Doe 将存储在索引 99 处。在发生冲突的情况下,如 ID 号为 19999 的 Jean Doe,她将存储在数组列表中的数组列表中,索引也为 99 . 当我打印出我的散列时 table 像这样多次打印出工人信息:
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.
我的打印方法有问题还是我没有正确创建哈希 [=17=]?
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;
}
}
问题
所以看这部分代码:
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
次。这就是为什么当您转到 "print" 您的数组时,您会看到:
When I print out my hash table prints out the worker information multiple time
(顺便说一句,这不是哈希表..)
解决方案
如果你真的想继续使用 ArrayList<ArrayList<Worker>>
然后为每个子列表创建一个 new 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
作为值
您将同一个子列表添加到主列表中 100 次,因此您添加的每个工作人员似乎都被添加到每个散列中 'bucket'。像这样更改填充方法中的代码:
// ArrayList<Worker> sublist = new ArrayList<>(); remove this line!
for (int j=0; j<100; j++) {
list.add(new ArrayList<Worker>());
}