2017-09-24 81 views
1

我正在進行一項練習,需要一種方法來總結數據中所有電話號碼的所有持續時間(即與呼叫者ID類似)。我已經設法總結持續時間,但不是所有的數據都正在打印。我一直在想,爲什麼會這樣,但我無法把頭繞在它身上。任何幫助將不勝感激。 下面是代碼:For循環沒有運行到最後?

//initial code provided 
    public static void main(String[] args) { 
      String[] phoneNumbers = new String[100]; 
      int[] callDurations = new int[phoneNumbers.length]; 
      int size = 0; 

      size = addCall(phoneNumbers, callDurations, size, "555-555-5555", 137); 
      size = addCall(phoneNumbers, callDurations, size, "555-555-0000", 12); 
      size = addCall(phoneNumbers, callDurations, size, "555-555-1234", 26); 
      size = addCall(phoneNumbers, callDurations, size, "555-555-8888", 10); 
      size = addCall(phoneNumbers, callDurations, size, "555-555-8888", 10); 
      size = addCall(phoneNumbers, callDurations, size, "555-555-7777", 10); 

     } 


     public static int addCall(String[] phoneNumbers, int[] callDurations, int size, String newNumber, int newDuration) { 
      if (size >= phoneNumbers.length) { 
      System.out.println("Error adding " + newNumber + ": array capacity exceeded."); 
      } else { 
      phoneNumbers[size] = newNumber; 
      callDurations[size] = newDuration; 
      size++; 
      } 

      return size; 
     } 

//the portion of code that I'm trying to write 

     public static void totalDurations(String[] phoneNumbers, int[] 
     callDurations, int size) { 
      String[] copyNum = new String[phoneNumbers.length]; 
      int[] copyDur = new int[phoneNumbers.length]; 
      int newSize = size; 
      int pos = 1; //counter for next available empty cell 
      copyNum[0] = phoneNumbers[0]; 
      copyDur[0] = callDurations[0]; 

      for (int i = 0; i < newSize; i++){ 
       for (int j = 1; j < size; j++){ 
       if (copyNum[i] != phoneNumbers[j]){ 
        copyNum[i+pos] = phoneNumbers[j]; 
        pos++; 
       } 
       else { 
        copyDur[i] += callDurations[j]; 
        newSize = newSize -1; 
       } 
       }   
      System.out.println(copyNum[i] + ":" + copyDur[i]+ "s"); 
      } 
      } 

我的電流輸出

Total Durations: 
555-555-5555:137s 
555-555-0000:12s 
555-555-1234:26s 
555-555-8888:20s 
+3

您是否熟悉IDE的調試功能? –

+0

不,我對Java很陌生(當前正在運行Dr Java),並沒有開始使用調試器。 – sly

+0

這部分工作並由教師提供。不,我沒有學過ArrayLists。 – sly

回答

1

這是一些非常醜陋的代碼,你一定需要在一個調試器中運行,但很明顯,我認爲錯誤是該行

newSize = newSize - 1; 

這減少外部for循環中正在使用的變量。如果您只通過了六個元素中的四個,那意味着已爲其中兩個元素輸入了else子句。也許你的意思是遞減size而不是?

想想你想在這裏做什麼。使用一個調試器,並以某種你不期待的方式查看出錯的地方。糾正他們。

+0

LOL。感謝您強調我缺乏技巧的可能錯誤。我會努力提高可讀性。感謝您的反饋 – sly

1

首先代碼很難閱讀/理解和容易出錯。我會使用這個類,並使用像Map和List這樣的數據類型。

public static class CallDuration { 
    String phoneNumber; 
    int duration; 

    public CallDuration(String phoneNumber, int duration) { 
     this.phoneNumber = phoneNumber; 
     this.duration = duration; 
    } 
} 

public static void main(String[] args) { 
    List<CallDuration> callDurations = new ArrayList<>(); 
    callDurations.add(new CallDuration("555-555-5555", 137)); 
    callDurations.add(new CallDuration("555-555-0000", 12)); 
    callDurations.add(new CallDuration("555-555-1234", 26)); 
    callDurations.add(new CallDuration("555-555-8888", 10)); 
    callDurations.add(new CallDuration("555-555-8888", 10)); 
    callDurations.add(new CallDuration("555-555-7777", 10)); 

    printCallDuration(callDurations); 
} 

private static void printCallDuration(List<CallDuration> callDurations) { 
    Map<String, Integer> totalCallDurationMap = new HashMap<>(); 
    for (CallDuration callDuration : callDurations) { 
     Integer value = totalCallDurationMap.computeIfAbsent(callDuration.phoneNumber, x -> 0); 
     totalCallDurationMap.put(callDuration.phoneNumber, value + callDuration.duration); 
    } 

    for (Map.Entry<String, Integer> entry : totalCallDurationMap.entrySet()) { 
     System.out.println(entry.getKey() + " - " + entry.getValue()); 
    } 
} 
+0

感謝您的替代方法。我開始介紹類來編程,並沒有學習你使用的Map和List類,但它確實更容易閱讀。我可以通過醜陋的編碼看到你們的意思。 XD感謝您的幫助和建議。 – sly