2009-12-19 66 views
1

我有名字的名单,称8名:乔,鲍勃,安德鲁·比尔,查理,萨拉,安,维克多的Java:迭代的HashMap - 算法所需

名的数量可能会有所不同**。

1)我应该使用什么名称列表?散列表,矢量,散列表,列表,ArrayList?

2)我需要像这样匹配他们:Joe-Bob,Andrew-Bill,Charlie-Sarah,Ann-Victor。你能告诉我一个例子如何做一个循环这样做?

谢谢!

+0

你能解释一下纯英文算法的逻辑吗?名字如何映射在一起?矢量在哪里? – 2009-12-19 01:47:54

+0

嘿,我修改了帖子。对不起,不清楚 – Andrey 2009-12-19 01:49:25

回答

1

散列图没有顺序。通过“关联”的名字和你

for(int i = 0; i < myArray.length - 1; i += 2) { 
    hashMap.add(myArray[i], myArray[i+1]); 
} 
+0

谢谢!但我有这个问题:如果我想在匹配时将两个人从名单中删除,它会起作用吗? java不会抱怨arraylist被修改了吗? – Andrey 2009-12-19 01:55:15

+0

你可以在'for'循环中修改数组 - 这只是一个导致问题的'foreach'循环。当然,需要记住的一点是,您需要相应地调整索引的值。 – 2009-12-19 01:57:17

+0

然后我可以做i = i-2(当我匹配两个人,将他们添加到hashmap中,我想从myArray中删除他们,然后我做i = i-2)?那是高效的算法吗? – Andrey 2009-12-19 02:01:42

0

这不完全清楚你的意思:如果你想要像你想插入名称的列表,你会做类似下面的(使用数组)需要与他们做。你也不会说这些名字是否独一无二。

您可以配对的名字是这样的:

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); 
0

你的选择应该取决于你想要这些名字的目的。你想要在名单上有效地搜索给定的姓氏吗?如果是,那么你应该遵循阿农的建议。否则,你可以创建一个类,在这里你可以保存关于每个人的信息(名字,姓氏,电话等),并使用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])); 
} 
0

如果你有一个数组入手,但要在处理元素时删除元素,首先将其转换为某种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

1)我应该使用什么名称列表?散列表,矢量,散列表,列表,ArrayList?

嗯,这取决于你的需求:)不过,因为这个问题,也因为你是混合收集界面(例如List)和具体的实施方式(例如ArrayListVector),我认为你应该与开始基本。一个真棒资源是来自Java(tm)教程的Trail: Collections,这是一个非常值得推荐的阅读材料。

首先,您需要了解各种集合接口及其用途。然后你会选择一个具体的实现。集合的根 -

  • Collection

    下表描述了核心 集合接口:那我报价如下,将帮助你的第一步教程的Interfaces节层次结构。集合 代表一组称为 其对象的元素。 Collection接口 是 所有收集实现的最小公分母,使用 将收集传递给 ,当需要最大 时,操作它们。有些类型的 集合允许重复元素, 和其他元素不包含。有些订购 和其他无序。 Java 平台不提供该接口的任何直接 实现,但是 提供更多 特定子接口的实现,诸如SetList。另请参阅The Collection Interface部分。

  • Set - 一个不能包含重复元素的集合。这 接口模型的数学集 抽象,用来表示 集,如卡包括 牌手,课程制作了 学生的日程安排,或过程 一台机器上运行。另请参阅The Set Interface部分。

  • List - 有序集合(有时称为序列)。列表 可以包含重复的元素。 List的 用户通常具有精确的 控制列表中每个元素被插入的位置,并且可以通过其整数索引 (位置)来访问 元素。如果您已使用Vector, ,则您熟悉List的一般 风味。另见The List Interface部分。

  • Queue - 用于在处理之前保存多个元素的集合。 除了基本的收集操作之外,队列还提供额外的插入,提取和检查操作。

    队列通常,但不必 排序FIFO中的元素 (先入先出)的方式。在 中,例外情况是优先级队列, 哪些命令元素根据 提供的比较器或元素的 自然排序。无论使用什么 排序,队列的头部 是通过调用removepoll将被删除 的元素。在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>存储匹配的名称。但是,因为算法的逻辑还不清楚(初始列表是否总是包含奇数个元素?是否与下一个元素总是关联?),我无法提供更多指导。