2009-12-19 88 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>存儲匹配的名稱。但是,因爲算法的邏輯還不清楚(初始列表是否總是包含奇數個元素?是否與下一個元素總是關聯?),我無法提供更多指導。