我有名字的名单,称8名:乔,鲍勃,安德鲁·比尔,查理,萨拉,安,维克多的Java:迭代的HashMap - 算法所需
名的数量可能会有所不同**。
1)我应该使用什么名称列表?散列表,矢量,散列表,列表,ArrayList?
2)我需要像这样匹配他们:Joe-Bob,Andrew-Bill,Charlie-Sarah,Ann-Victor。你能告诉我一个例子如何做一个循环这样做?
谢谢!
我有名字的名单,称8名:乔,鲍勃,安德鲁·比尔,查理,萨拉,安,维克多的Java:迭代的HashMap - 算法所需
名的数量可能会有所不同**。
1)我应该使用什么名称列表?散列表,矢量,散列表,列表,ArrayList?
2)我需要像这样匹配他们:Joe-Bob,Andrew-Bill,Charlie-Sarah,Ann-Victor。你能告诉我一个例子如何做一个循环这样做?
谢谢!
散列图没有顺序。通过“关联”的名字和你
for(int i = 0; i < myArray.length - 1; i += 2) {
hashMap.add(myArray[i], myArray[i+1]);
}
这不完全清楚你的意思:如果你想要像你想插入名称的列表,你会做类似下面的(使用数组)需要与他们做。你也不会说这些名字是否独一无二。
您可以配对的名字是这样的:
String input = "Joe, Bob, Andrew, Bill, Charlie, Sarah, Ann, Victor";
String names[] = input.split(",");
Map<String, String> output = new HashMap<String, String>();
for (int i=0; i<names.length; i+=2) {
output.put(names[i].trim(), names[i+1].trim());
}
然后执行:
output.remove("Joe"); // Joe is paired with Bob
如果您还需要鲍勃·乔关联,你可以这样来做:
String input = "Joe, Bob, Andrew, Bill, Charlie, Sarah, Ann, Victor";
String names[] = input.split(",");
Map<String, String> output = new HashMap<String, String>();
for (int i=0; i<names.length; i+=2) {
String first = names[i].trim();
String second = names[i+1].trim();
output.put(first, second);
output.put(second, first);
}
然后再做:
String other = output.remove("Joe");
output.remove(other);
你的选择应该取决于你想要这些名字的目的。你想要在名单上有效地搜索给定的姓氏吗?如果是,那么你应该遵循阿农的建议。否则,你可以创建一个类,在这里你可以保存关于每个人的信息(名字,姓氏,电话等),并使用Vector来保存这个类的实例。这个类的一个例子是:
class PersonDetails {
String firstName;
String lastName;
public PersonDetails(String fn, String ln) {
firstName = fn;
lastName = ln;
}
}
Vector中名称的插入,你可以使用类似以下内容:
for(int i = 0; i < nameArray.length; i += 2) {
vector.add(new PersonDetails(nameArray[i], nameArray[i+1]));
}
如果你有一个数组入手,但要在处理元素时删除元素,首先将其转换为某种List
。此外,从ArrayList
开始移除项目可能会非常昂贵,因此如果您有很多名称,则可能需要使用LinkedList
(尽管在性能和内存利用率之间实际使用它的原因很少,但它最好有一个圆形的List
但这不符合Java的标准)。
所以,你的情况,你知道你将要处理列表顺序,以便最有效的,我能想到的是创建一个ArrayList
和扭转它,然后从最终删除,这样的:
private Map matchNames(String[] names) {
List namesList = new ArrayList(Arrays.asList(names));
Collections.reverse(namesList);
Map result = new HashMap(namesList.size()/2);
while (!namesList.isEmpty()) {
result.put(namesList.remove(namesList.size() - 1),
namesList.remove(namesList.size() - 1));
}
return result;
}
1)我应该使用什么名称列表?散列表,矢量,散列表,列表,ArrayList?
嗯,这取决于你的需求:)不过,因为这个问题,也因为你是混合收集界面(例如List
)和具体的实施方式(例如ArrayList
或Vector
),我认为你应该与开始基本。一个真棒资源是来自Java(tm)教程的Trail: Collections,这是一个非常值得推荐的阅读材料。
首先,您需要了解各种集合接口及其用途。然后你会选择一个具体的实现。集合的根 -
Collection
:
下表描述了核心 集合接口:那我报价如下,将帮助你的第一步教程的Interfaces节层次结构。集合 代表一组称为 其对象的元素。
Collection
接口 是 所有收集实现的最小公分母,使用 将收集传递给 ,当需要最大 时,操作它们。有些类型的 集合允许重复元素, 和其他元素不包含。有些订购 和其他无序。 Java 平台不提供该接口的任何直接 实现,但是 提供更多 特定子接口的实现,诸如Set
和List
。另请参阅The Collection Interface部分。
Set
- 一个不能包含重复元素的集合。这 接口模型的数学集 抽象,用来表示 集,如卡包括 牌手,课程制作了 学生的日程安排,或过程 一台机器上运行。另请参阅The Set Interface部分。
List
- 有序集合(有时称为序列)。列表 可以包含重复的元素。 List的 用户通常具有精确的 控制列表中每个元素被插入的位置,并且可以通过其整数索引 (位置)来访问 元素。如果您已使用Vector
, ,则您熟悉List
的一般 风味。另见The List Interface部分。
Queue
- 用于在处理之前保存多个元素的集合。 除了基本的收集操作之外,队列还提供额外的插入,提取和检查操作。
队列通常,但不必 排序FIFO中的元素 (先入先出)的方式。在 中,例外情况是优先级队列, 哪些命令元素根据 提供的比较器或元素的 自然排序。无论使用什么 排序,队列的头部 是通过调用remove
或poll
将被删除 的元素。在FIFO 队列中,所有新元素在队列尾部插入 。排队的其他种类 可能会使用不同的放置规则 。每个Queue
实施必须 指定其排序属性。另外 参见The Queue Interface部分。
Map
- 将键映射到值的对象。地图不能包含重复的 键;每个键最多可以映射一个 的值。如果您已经使用Hashtable
, 您已经熟悉Map
的 基础知识。另请参阅The Map Interface部分。
在你的情况,我不认为你想有一个Queue
,我不知道你需要一个Map
,我想你想允许重复元素,所以你不想做Set
这给我们留下了一个List
。
关于具体实现,如果不需要线程安全实现,则取决于2)中的算法 - 可能是一个不错的选择)。但真的,请看教程的Implementations部分以了解更多信息。
2)我需要像这样匹配他们:Joe-Bob,Andrew-Bill,Charlie-Sarah,Ann-Victor。你能告诉我一个例子如何做一个循环这样做?
如果初始列表可以包含重复的元素,我不会用一个Map
存储匹配的名称(因为Map
不能包含重复键)。所以,我想创建一个Couple
类来存储相关名称:
public class Couple {
private name1;
private name2;
...
}
,并使用List<Couple>
存储匹配的名称。但是,因为算法的逻辑还不清楚(初始列表是否总是包含奇数个元素?是否与下一个元素总是关联?),我无法提供更多指导。
你能解释一下纯英文算法的逻辑吗?名字如何映射在一起?矢量在哪里? – 2009-12-19 01:47:54
嘿,我修改了帖子。对不起,不清楚 – Andrey 2009-12-19 01:49:25