我有名字的名單,稱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