首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:迭代HashMap -需要的算法

问Java:迭代HashMap -需要的算法
EN

Stack Overflow用户
提问于 2009-12-19 09:42:03
回答 5查看 1.7K关注 0票数 1

我有一个名单,说8个名字:乔,鲍勃,安德鲁,比尔,查利,萨拉,安,维克多

名称计数可能不同**。

1)我应该使用什么作为名字列表?哈希表,向量,哈希表,列表,ArrayList?

2)我需要像这样匹配它们: Joe-Bob,Andrew-Bill,Charlie-Sarah,Ann Victor。你能给我举个例子,怎么做一个这样的循环吗?

谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-19 09:45:27

Hashmap没有顺序。如果你想插入一个你想要的名字列表,你可以做如下操作(使用一个数组):

代码语言:javascript
复制
for(int i = 0; i < myArray.length - 1; i += 2) {
    hashMap.add(myArray[i], myArray[i+1]);
}
票数 1
EN

Stack Overflow用户

发布于 2009-12-19 11:20:10

1)我应该使用什么作为名字列表?哈希表,向量,哈希表,列表,ArrayList?

好吧,这取决于您的需求:)但是,由于这个问题以及您混合了集合接口(例如List)和具体实现(例如ArrayList或Vector),我认为您应该从基础开始。有关这方面的一个很棒的资源是来自 Java(tm) Tutorials的,这是一本非常推荐的读物。

首先,您需要了解各种收集接口及其用途。然后您将选择一个具体的实现。我在下面引用的教程的Interfaces部分将帮助您完成第一步:

下表描述了核心集合接口:

  • Collection -集合层次结构的根。集合表示一组称为其元素的对象。Collection接口是所有集合实现的最小公分母,用于传递集合并在需要最大通用性时对其进行操作。某些类型的集合允许重复的元素,而其他类型的集合则不允许。一些是有序的,另一些是无序的。Java平台没有提供这个接口的任何直接实现,但是提供了更具体的子接口的实现,比如Set和List。另请参阅The Collection Interface section.
  • Set -一个不能包含重复元素的集合。此接口对数学集合抽象进行建模,并用于表示集合,例如包含扑克牌的卡片、组成学生时间表的课程或在机器上运行的过程。另请参阅序列集合-有序集合(有时称为序列( The Set Interface ))。列表可以包含重复的元素。列表的用户通常对每个元素在列表中的插入位置有精确的控制,并且可以通过元素的整数索引(位置)来访问元素。如果您使用过Vector,那么您应该熟悉List的一般风格。另请参阅The List Interface section.
  • Queue -用于在处理之前保存多个元素的集合。除了基本的收集操作外,队列还提供附加的插入、提取和检查操作。

队列通常(但不一定)以FIFO (先进先出)方式对元素排序。其中的例外是优先级队列,它根据提供的比较器或元素的自然排序对元素进行排序。无论使用哪种排序,队列的头部都是将通过调用remove或poll删除的元素。在FIFO队列中,所有新元素都插入到队列的尾部。其他类型的队列可以使用不同的放置规则。每个Queue实现都必须指定其排序属性。另请参阅The Queue Interface section.

  • Map -将键映射到值的对象。映射不能包含重复的键;每个键最多可以映射到一个值。如果您使用过Hashtable,那么您已经熟悉了Map的基础知识。另请参阅The Map Interface部分。

在你的例子中,我不认为你需要一个Queue,我不确定你是否需要一个Map,我认为你想要允许重复的元素,所以你不想要一个Set,这就给我们留下了一个List。

关于具体的实现,如果不需要线程安全的实现,ArrayList -或者LinkedList,取决于2)中的算法-可能是一个很好的选择)。但实际上,请查看本教程的Implementations部分以了解更多信息。

2)我需要像这样匹配他们:乔-鲍勃,安德鲁-比尔,查利-萨拉,安-维克多。你能给我举个例子,怎么做一个这样的循环吗?

如果初始列表可以包含重复的元素,我就不会使用Map来存储匹配的名称(因为Map不能包含重复的键)。因此,我将创建一个Couple类来存储相关的名称:

代码语言:javascript
复制
public class Couple {
    private name1;
    private name2;
    ...
}

并使用List<Couple>存储匹配的名称。但是,由于算法的逻辑仍然不清楚(初始列表是否总是包含奇数个元素?一个元素总是与下一个元素相关联吗?),我不能提供更多的指导。

票数 1
EN

Stack Overflow用户

发布于 2009-12-19 10:15:15

你所说的“关联”这些名字是什么意思,以及你需要对它们做什么,这并不是很清楚。你也不会说这些名字是否是唯一的。

您可以这样配对名称:

代码语言:javascript
复制
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());
}

然后执行以下操作:

代码语言:javascript
复制
output.remove("Joe"); // Joe is paired with Bob

如果您还需要将Bob与Joe关联起来,您可以这样做:

代码语言:javascript
复制
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);
}

然后执行以下操作:

代码语言:javascript
复制
String other = output.remove("Joe");
output.remove(other);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1931660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档