2014-09-11 4 views
0

ArrayList에서 가장 일반적인 이름과 가장 일반적인 이름을 찾는 데 문제가 있습니다. 수식은 이름 파일을 거쳐야하며 목록에 몇 개의 공통 이름이 있는지 계산해야합니다. 그런 다음 공통 이름을 가장 많이 인쇄합니다. 나는 이미 대부분의 ArrayList Part를 완성했다. 문제를 일으키는 가장 일반적인 이름을 찾는다. 나는 그것을 시작하는 방법을 모른다. 나는 온라인으로 보려고했지만 아무 것도 찾을 수 없었다. 나는 그것을 알아 내려고 노력했지만, 이것은 내가 .equals를 사용하고 있다고 생각할 수있는 전부이다.Java에서 ArrayList의 가장 일반적인 이름을 찾는 방법

for (int i = 0; i< dogs.size(); i++) 
if dogs.get(0).getName().equals dogs.get(i).getName(); 
{ 

} 
+0

예를 들어'java.util.Map' impl을 사용할 수 있습니다. java.util.HashMap ' – Arvind

+0

http://stackoverflow.com/questions/14260134/elegant-way-of-counting-occurrences-in-a-java-collection – Jason

답변

1

...이 목록 (Map)를 통해 실행하고 당신이 가서 하나는 이름을 추적, 가장 낮은 수를 가지고있는 확인

List<Dog> dogs; // populate 
Map<String, Integer> counts = new HashMap<>(); 
for (Dog dog : dogs) { 
    Integer count = counts.get(dog.getName()); 
    counts.put(dog.getName(), count == null ? 1 : count + 1); 
} 

List<Map.Entry<String, Integer>> entries = new ArrayList<>(counts.entrySet()); 
Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() { 
    public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { 
     return Integer.compare(o2.getValue(), o1.getValue()); // Note reverse order 
    } 
}); 
String leastCommonName = entries.get(0).getKey(); 
int leastCommonFrequency = entries.get(0).getValue(); 

여기에 적게 사용 된 이름을 찾는 자바 8 버전입니다 :

최소를 찾기 위해 컬렉션 API를 사용

기본적으로 목록 작성 및 정렬은 피하고 동일한 비교자를 사용하지만 람다 식으로 스트림 (항목)의 최소값을 찾는 한 줄자로 대체됩니다.

+0

흥미로운 접근 방법입니다. 일단 눈을 씻어 내고 다시 읽으려고하면, 알아낼 것입니다. 그것이하는 일;). 핵심 차이점은 원래 목록이 정렬되지 않은 방법에있을 것입니다 ... – MadProgrammer

+0

@MadProgrammer 그래, 나는 당신이 안구에 대해 무슨 뜻인지 알아. 이것은 성능적인 것이 아닙니다. "우아"하다고 생각되지만 솔직히 말해서 Java의 자세한 구문에 실망했습니다 (평소와 같이). 아이디어는 있지만 기존 학교 방식보다 코드가 적습니다. 나는 돌아와서 java8의 클로저를 사용하여 어떻게 보이는지 살펴야 할 것이다. – Bohemian

+0

나는 그 접근법을 좋아해, 나는 그저 내 주위로 조금만 나를 데려 갔다. Map.Entry를 보는데 사용하지 않습니다. – MadProgrammer

1
  • Map<String, Integer>을 만듭니다. 그것은 name가 포함되어있는 경우 귀하의 ArrayList 통해
  • 루프, 그것은 않는 경우, 값을 증가하고 Map에 다시 넣고, 그렇지, 새 항목을 만들에 그것을 넣어 볼 수 Map을 확인합니다.

이것은 이름의 목록과 나타나는 횟수를 제공합니다. 다음, 데이터를 수집하기 위해 Map를 사용

예를 들어

...

List<Dog> dogs = new ArrayList<>(25); 
Map<String, Integer> dogNames = new HashMap<>(25); 
for (Dog dog : dogs) { 
    Integer value = dogNames.get(dog); 
    if (value == null) { 
     value = 0; 
    } 
    value++; 
    dogNames.put(dog.getName(), value); 
} 

int leastCommon = Integer.MAX_VALUE; 
String leastCommonName = null; 
for (String name : dogNames.keySet()) { 
    int value = dogNames.get(name); 
    if (value < leastCommon) { 
     leastCommon = value; 
     leastCommonName = name; 
    } 
} 

System.out.println("Least common (" + leastCommon + ") is " + leastCommonName); 
+0

@ 보헤미안 가능한 것은 확실하지 않습니다. 반복되는 데이터가 너무 많습니다. 우리는 또한 중복 된 항목을 대조하려고 노력하고 있습니다. 'Set'에 대해 생각한 일종의 생각은'TreeMap'에 대해 생각했습니다. – MadProgrammer

+0

[This] (http://stackoverflow.com/a/25780327/256196) 내가 의미하는 바입니다. – Bohemian

관련 문제