2013-01-19 3 views
3

특정 대상 번호에 대한 호출에 대한 정보가 들어있는 개체의 배열이 있습니다. 나는이 목록을 검색하고 발생 횟수가 가장 많은 숫자 (연결된 클래스의 다른 메서드에서 호출 됨)를 반환하는 가장 좋은 방법을 찾아 내려고 노력했습니다. 예를 들어자바에서 arraylist의 특정 필드에 의한 대부분의 개체 찾기

:

나는 주소록 다음

public void makeCall(Phonecall call) 
    { 
    call = new Phonecall(); 
    call.setDestination(anyNumber()); 
    call.setDuration(0 + (int)(Math.random() * (((balance/25) * 60) - 0) + 1)); 
    double cost = (call.getDuration()/60 * 25); 
    balance = getBalance() - cost; 
    updateCallHistory(call); 
    } 

나는에 임의의 숫자를 호출하여 목록에 호출을 추가하는이 방법은 ArrayList를 검색 할 수 있어야해야 함을 callHistory 가장 많은 횟수로 호출 된 대상을 업데이트하고 해당 번호와 개수를 반환합니다.

그런 다음 각 "전화"에 대해이 값을 호출하고 모든 "전화"에서 가장 높은 수의 대상과 그 수를 인쇄합니다.

나는 주변을 둘러 보았고 특정 개체의 발생을 찾는 데 필요한 정보를 찾았지만 개체 자체가 아닌 해당 개체의 특정 필드를 검사하는 방법을 알지 못했습니다.

미안 미안하지만, 혼란 스러울 정도로 혼란스럽고 아이디어가 부족 해지면 내 해시 매핑이 아직 강력하지 않아서 내가 원하는 것을 찾은 사례를 수정하지 못했습니다.

내가

public void mostCalled(String[] args) 
    { 
     Map<Phonecall,Integer> map = new HashMap<Phonecall, Integer>(); 
     for(int i=0;i<callHistory.size();i++){    
      Integer count = map.get(callHistory.get(i));   
      map.put(callHistory.get(i), count==null?1:count+1); 
     } 
     System.out.println(map); 
    } 

을 가지고 있지만 내가 phonecall를의 대상 필드 대신 개체 자체를 사용하는 방법을 모르는 아래의 의견에 따라. 이 같은

겠습니까 뭔가 더 적합 :

public void mostCalled(String[] args) 
    { 
     Map<String,Integer> map = new HashMap<String, Integer>(); 
     for(Phonecall call : callHistory) 
     { 
      Integer count = map.get(call.destination);   
      map.put(call.destination, count==null?1:count+1); 
     } 
     System.out.println(map); 
    } 
+0

전화를 키로 사용하고 값을 계산할 수있는'' '맵을 사용하십시오. ArrayList를 반복하면서지도를 채우십시오. – MrSmith42

+0

마지막 질문에 답하기 위해 PhoneCall 선언을 더 잘 보았습니다. 그러나 for를 사용하여 List를 검사하지 않는 것이 좋습니다. 반복기를 사용하는 것이 좋습니다. 내일 ArrayList가 LinkedList가된다면, 더 나은 방법을 배울 것입니다! – gd1

+0

object 대신 string을 사용하고 카운터 대신 iterator를 사용하여 또 다른 시도를 추가했습니다. 그게 내가 맨 먼저해야하는 것과 더 비슷합니까? –

답변

2

하나의 솔루션은 키와 값으로,이 번호로 통화의 수와 전화 번호를 개최 것 Map<String, Integer> phoneCount를 선언하는 것입니다.

그런 다음 ArrayListPhoneCall 개체를 반복하여지도를 작성하십시오. 가장 큰 가치를 지닌 레코드가 당신이 찾고있는 레코드입니다.

+0

PhoneCall 개체의 "대상"필드를 개체 자체 대신 키로 저장하는 방법은 무엇입니까? –

+1

나는 그것을 와 같이 선언했다. 목적지 전화 번호는 아마도 String이다. –

0

이 작업을 수행하려는 다른 모든 사람들에게 이것이 결국 내가 결론 내린 것입니다.

public void mostCalled() 
    { 
     Map<String,Integer> map = new HashMap<String, Integer>(); 
     for(Phonecall call : callHistory) 
     { 
      Integer count = map.get(call.destination);   
      map.put(call.destination, count==null?1:count+1); 
     } 
     List<String> maxKeyList=new ArrayList<String>(); 
     Integer maxValue = Integer.MIN_VALUE; 
     for(Map.Entry<String,Integer> entry : map.entrySet()) 
     { 
      if(entry.getValue() > maxValue) 
      { 
       maxValue = entry.getValue(); 
       maxKeyList.add(entry.getKey()); 
      } 
     } 
     System.out.println("Phone numbers called the most : "+maxKeyList); 
    } 
관련 문제