2017-09-14 57 views
0

我正在嘗試編寫一個程序來計算在String []數組中的所有字符串中出現的常見元素。我有以下幾點: -計數字符串數組中的常見元素

陣列和陣列標誌兩者大小的查閱26

每串:我標記頻率1爲每個字符似乎在字符串中不增加標誌數組。

現在我加入標誌數組的值對應的母版陣列值

我的代碼看起來像這樣

for(String str : arr) 
{ 
    for(char ch : str.toCharArray()) 
    { 
     flag[ch - 97] = 1; 
     master[ch - 97] =master[ch -97] + flag[ch - 97]; 
    } 
} 

我的計劃是最終計數主陣列中具有價值相等的元素輸入字符串數組的長度。 這個計數將代表所有字符串共有的字符數

但是我的代碼有一個缺陷。

如果一個String有重複的元素,例如'ball'(有2個ls)。 主數據庫中元素的對應值再次遞增。 這使得它的價值比我想要的更大。

所以這就是我所做的。

for(String str : arr) 
{ 
    newstr = ""; //to keep track of each character in the string 

    for(char ch : str.toCharArray()) 
    { 
     int counter = 0; 
     for(int i = 0; i < newstr.length();i++) 
     { 
      char ch2 = newstr.charAt(i); 
       if (ch == ch2) 
       { 
        counter = counter + 1; //if duplicate 
        break; 
       } 
     } 

    if(counter == 1) 
    { 
     break; 
    } 
    flag[ch - 97] = 1; 
    master[ch - 97] =master[ch -97] + flag[ch - 97]; 
    newstr = newstr + ch; 

    } 
} 

這是正確的做法嗎?或者這個代碼是否可以更優化?

+1

那麼你想達到什麼? – Pratham

+0

'counter = counter + 1'後,您可以編寫'return'語句。這樣可以避免下一個條件。 – procrastinator

+0

@procrastinator由於數組中還有其他字符串需要測試,所以我不能「返回」。 –

回答

0

恕我直言 - 「正確的做法」是你完全理解並可以隨意重構的。通常總是有多種方法來解決任何編程問題。就我個人而言,我會以一種對Java更具意義的方式來解決(我認爲是)您嘗試解決的問題。

對於你要檢查字符串的整個陣列,您檢查第一個字符串中的每個字符是在目前所研究的每串,所以在第一個字符串中的每個字符會進入一個Map<Character, Integer>charCountMap.put(aChar, 1)對於第二個字符串以及其後的每個字符串:如果被檢查字符串中的字符位於映射的keySet中,則增加相關的Integer(遞增該鍵的相關值)charCountMap.get(aChar)++。在檢查每個字符串中的每個字符之後,那麼映射到Integers的keyset中的鍵與原始字符串數組長度匹配的值恰好是每個字符串中找到的字符。

到目前爲止,這個建議的解決方案並不能解決上述重複字符問題。爲了解決這個問題,我認爲你需要在「正在檢查的字符串」中保留一個單獨的「迄今爲止」字符的列表(並且清空每個新字符串的列表)。您將首先檢查「迄今爲止」列表,並且如果在「迄今爲止」中找到,則跳過對該字符的所有進一步處理,僅針對地圖的鍵集。 example code

還有一個遞歸方法來編程解決這個問題,但我會讓那個水果掛低...

+0

這正是我在我的代碼中所做的。每次將'newstr'清空並檢查它。 –