2009-12-19 2 views
1

내가 이름의 목록을 필요는 8 이름을 말한다.자바 : - : ** 이름의 개수가 다를 수 있습니다 조, 밥, 앤드류, 빌, 찰리, 사라, 앤, 빅터</p> <p>순회 HashMap의 알고리즘

1) 이름 목록으로 무엇을 사용해야합니까? 해시 맵, 벡터, Hashtable, List, ArrayList?

2) Joe-Bob, Andrew-Bill, Charlie-Sarah, Ann-Victor와 같이 일치시켜야합니다. 그렇게 할 수있는 루프를 만드는 방법을 보여 주시겠습니까?

감사합니다.

+0

일반 영어로 알고리즘의 논리를 설명해 주시겠습니까? 이름은 어떻게 매핑됩니까? 벡터는 어디에 있습니까? –

+0

안녕하세요, 게시글을 수정했습니다. 명확하지 않다면 죄송합니다 – Andrey

답변

1

해시 맵에는 순서가 없습니다. "연관"이름과 무엇을하여

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

고마워! 그러나 나는이 질문을 가지고있다 : 내가 그들을 일치시킬 때 내가리스트에서 두 명을 제거하고 싶다면 그것이 효과가 있을까? 자바 arraylist 수정 된 불평하지 않을까요? – Andrey

+0

'for' 루프에서 배열을 잘 수정할 수 있습니다 - 문제를 일으키는'foreach' 루프 일뿐입니다. 물론 명심해야 할 점은 색인의 가치를 적절하게 조정해야한다는 것입니다. –

+0

그 다음에 (내가 두 사람을 매치시키고 해시 맵에 추가했을 때, 나는 그들을 iArray에서 제거하고 싶습니다. 그 후에 i = 2)합니까? 그게 효율적인 알고리즘인가요? – Andrey

0

그것은 당신이 무슨 뜻인지 정확히 분명하지 않다 : 당신은 당신이 원하는 같은 이름의 목록을 삽입 할 경우 (배열 포함)는 다음과 같이 할 것 그들과 관련이 있어야합니다. 또한 이름이 고유한지 여부는 밝히지 않았습니다. 당신은 이름이 방법을 페어 (pair) 할 수 있습니다

: 다음

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()); 
} 

및 수행

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); 
} 
: 당신은 또한 조와 함께 밥을 연결해야하는 경우

output.remove("Joe"); // Joe is paired with Bob 

, 당신은 이런 식으로 할 수

다음으로 수행 :

String other = output.remove("Joe"); 
output.remove(other); 
0

선택 사항은 원하는 이름에 따라 달라집니다. 주어진성에 대해 목록을 효율적으로 검색 하시겠습니까? 그렇다면 Anon의 제안을 따라야합니다.

그렇지 않으면 각 사람 (이름, 성, 전화 번호 등)에 대한 정보를 유지할 수있는 클래스를 만들고 Vector를 사용하여이 클래스의 인스턴스를 유지할 수 있습니다. 이 클래스의 예는 될 수있다 : 당신은 다음과 같은 것을 사용 할 수있는 벡터에있는 이름의 삽입을 위해

class PersonDetails { 

    String firstName; 
    String lastName; 

    public PersonDetails(String fn, String ln) { 
     firstName = fn; 
     lastName = ln; 
    } 
} 

:

for(int i = 0; i < nameArray.length; i += 2) { 
    vector.add(new PersonDetails(nameArray[i], nameArray[i+1])); 
} 
0

당신이 시작하는 배열을 가지고 있지만 원하는 경우 처리 할 때 요소를 제거하려면 먼저 List으로 변환하십시오. 또한 ArrayList의 시작 부분에서 항목을 제거하는 것은 매우 비쌀 수 있습니다. 따라서 많은 이름을 가진 경우 LinkedList을 사용하는 것이 좋습니다 (실제로 성능과 메모리 사용 간에는 거의 이유가 없지만 순환 List을 갖는 것이 더 좋지만 자바에서는 표준이 아닙니다.

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을 만드는 것입니다 생각하고 다음과 같이 끝에서 제거 후 반전 할 수있는 가장 효율적인 있도록 목록을 순차적으로 처리됩니다 알고

1) 이름 목록으로 무엇을 사용해야합니까? 해시 맵, 벡터, Hashtable, List, ArrayList?

글쎄, 당신의 필요에 따라 달라집니다 :)하지만, 때문에 질문을하고 (예를 들어 List) 컬렉션 인터페이스를 혼합 콘크리트 구현 (예 : ArrayList 또는 Vector) 때문에, 난 당신이 시작해야한다고 생각 기초. 굉장한 리소스는 Java (tm) 튜토리얼의 Trail: Collections입니다.

먼저 다양한 콜렉션 인터페이스와 그 용도를 이해해야합니다. 그런 다음 구체적인 구현을 선택하게됩니다. 컬렉션의 루트 -

  • Collection : 다음 목록은 핵심 컬렉션 인터페이스를 설명

    : 내가 처음 단계에서 당신을 도울 것입니다 아래에 인용하고있어 튜토리얼의 Interfaces 섹션 계층. 컬렉션 은 요소로 알려진 개체 그룹을 나타냅니다. Collection 인터페이스 은 모든 컬렉션이 구현되고 컬렉션을 전달하는 데 사용되며 일반은 최대 일반성이 필요할 때 조작합니다. 일부 유형의 컬렉션은 중복 요소를 허용하고 등은 그렇지 않습니다. 일부는 으로 주문되며 나머지는 정렬되지 않습니다. 자바 플랫폼은이 인터페이스의 직접적인 구현을 제공하지 않지만 는 SetList 같은 더 특정 서브 인터페이스의 구현을 제공합니다. 자세한 내용은 The Collection Interface 섹션을 참조하십시오.

  • Set - 중복 요소를 포함 할 수없는 모음입니다. 이 인터페이스는 모델 수학 세트 추상화와 같은 카드가 포커 손을 포함하는 등 세트를 나타 내기 위해 사용되는이 과정은 학생의 일정을 구성하는, 또는 프로세스 는 컴퓨터에서 실행. The Set Interface 섹션을 참조하십시오.

  • List - 주문 컬렉션 (시퀀스라고도 함). 목록 에는 중복 요소가 포함될 수 있습니다. 목록의 사용자는 일반적으로 목록에서 각각 요소가 삽입 된 곳에서 정확한 제어를 가지고 있으며 정수 인덱스 (위치)을 사용하여 요소에 액세스 할 수 있습니다. Vector을 사용한 경우 은 맛을 익히고 List입니다. 자세한 내용은 The List Interface 섹션을 참조하십시오.

  • Queue - 처리하기 전에 여러 요소를 보유하는 데 사용되는 모음. 기본 수집 작업 외에도 큐는 추가 삽입, 추출 및 검사 작업을 제공합니다.

    대기열은 대개 이지만 반드시 (선입 선출 방식)으로 주문하십시오. 중에는 제공된 요소 또는 자연 순서에 따라 요소를 정렬하는 우선 순위 큐 이 있습니다. 순서가 사용 된 경우 큐 의 머리글은 remove 또는 poll을 호출하여 을 제거 할 수있는 요소입니다. FIFO 대기열에서 모든 새로운 요소는 대기열의 끝에있는 에 삽입됩니다. 다른 종류의 대기열은 다른 배치 규칙을 사용할 수 있습니다. Queue 구현마다 의 주문 속성을 지정해야합니다. 또한 The Queue Interface 섹션을 참조하십시오.

  • Map - 키를 값에 매핑하는 객체입니다. 지도에 중복 된 키가 포함될 수 없습니다. 각 키는 최대 하나의 값에 매핑 할 수 있습니다. Hashtable을 사용한 경우 은 기본 사항이 이미 Map에 익숙합니다. 또한 The Map Interface 섹션을 참조하십시오.

    귀하의 경우에는

, 나는 당신이 Queue, 나는 당신이 Map 필요 확실하지 않다한다고 생각하지 않는다, 나는 당신이 Set을하지 않도록 중복 요소를 허용 할 생각 그리고 이것은 우리에게 List을 남겨 둡니다.

구체적인 구현에서 스레드 안전 구현이 필요하지 않은 경우 2)의 알고리즘에 따라 ArrayList - 또는 LinkedList이 좋은 선택 일 수 있습니다. 그러나 실제로, 자세히 알아 보려면 자습서의 Implementations 섹션을보십시오.

2) 저는 Joe-Bob, Andrew-Bill, Charlie-Sarah, Ann-Victor와 같이 일치시켜야합니다. 그렇게 할 수있는 루프를 만드는 방법을 보여 주시겠습니까? 초기 목록에 중복 요소를 포함 할 경우

, 나는 (A Map 중복 키를 포함 할 수 없기 때문에) 일치하는 이름을 저장하기 위해 Map를 사용하지 않을 것입니다.

public class Couple { 
    private name1; 
    private name2; 
    ... 
} 

과 일치하는 이름을 저장하기 위해 List<Couple>를 사용 : 그래서, 관련 이름을 저장하는 Couple 클래스를 만들 것입니다. 그러나 알고리즘의 논리가 여전히 명확하지 않기 때문에 (초기 목록에는 항상 홀수 개의 요소가 포함되어 있습니까? 항상 다음 요소와 관련된 한 요소입니까?), 더 많은 지침을 제공 할 수는 없습니다.

관련 문제