2015-10-02 152 views
1

我在採訪中得到了一個java問題。在字符串中打印不同的字符,並在每個字符下面打印星號(*),以顯示該字符串中字符重複的次數。打印星號(*)在字符串中的字符在java

對於例如:我的字符串是「GOOGLE」,那麼輸出應該是

G O L E 
* * * * 
* * 

我在java中試過,我能創造一個HashMap,將重複的字符和數字存儲的字符串中。但是HashMap不是基於字符串的插入順序。我也不知道我的下一步應該是什麼。有人能幫我嗎?在此先感謝

public void myFunction(String str) { 
    int length = str.length(); 
    HashMap<Character, Integer> hm = new HashMap<>(); 
    for(int i=0;i<length;i++){ 
     char ch = str.charAt(i); 
     if(hm.containsKey(ch)){ 
      hm.put(ch, hm.get(ch)+1);    
     } 
     else { 
      hm.put(ch, 1); 
     } 


    } 
     System.out.println(hm); 
} 

OUTPUT - Enter a String: 
GOOGLE 
{E=1, G=2, L=1, O=2} 
+0

你可以找到答案在這裏:http://stackoverflow.com/questions/683518/java-class-that-implements-map-and-keeps-insertion-order 檢查尤其是LinkedHashMap的 – VLef

+0

有沒有需要使用HashMap來做這樣簡單的事情。這是相關的,但是矯枉過正。具有3行代碼的簡單1D陣列可以實現。 – user3437460

回答

2

如果您使用LinkedHashMap它將保持插入的順序。你可以做這樣的事情。還要添加一個max變量,因爲我們稍後會在打印時需要它。

String input = "GOOGLE"; 
int max = 0; 
LinkedHashMap<Character, Integer> map = new LinkedHashMap<>(); 
for (char c: input.toCharArray()){ 
    if (map.containsKey(c)){ 
     map.put(c, map.get(c) + 1); 
    }else{ 
     map.put(c, 1); 
    } 
    max = Math.max(max, map.get(c)); 
} 
System.out.println(map); 

輸出:

{G=2, O=2, L=1, E=1} 

然後,只需遍歷你有多少行打印,並通過每個字符迭代。像這樣的東西應該可以做到。

for (int i=0; i<=max; i++){ 
    for (char c: map.keySet()){ 
     if (i==0){ 
      System.out.print(c); 
     }else if (i<= map.get(c)){ 
      System.out.print("*"); 
     }else{ 
      System.out.print(" "); 
     } 
    } 
    System.out.println(); 
} 

輸出:

GOLE 
**** 
** 
0

這是一個良好的開端。

我會做下一個是改變HashMapLinkedHashMap這樣我們就可以保持字符的順序,並添加long知道次的字符出現的最大數量。通過該LinkedHashMap迭代

public void myFunction(String str) { 
int length = str.length(); 
long maxOcurrences = 0; 
LinkedHashMap<Character, Integer> hm = new LinkedHashMap<>(); 
for(int i=0;i<length;i++){ 
    char ch = str.charAt(i); 
    long nextValue; 
    if(hm.containsKey(ch)){ 
     nextValue = hm.get(ch)+1 
     hm.put(ch, nextValue);    
    } 
    else { 
     nextValue = 1; 
     hm.put(ch, nextValue); 
    } 

    if(nextValue > maxOcurrences) 
    {maxOcurrences = nextValue;} 


} 
    System.out.println(hm); 
} 

接下來,我將打印的人物依次爲:因此,我將你當前的代碼更改爲類似。喜歡的東西:

for (Map.Entry<Character, Integer> entry : hm.entrySet()) { 
    System.out.print(entry.getKey()); 
} 
System.out.println(); 

最後,我將創建一個循環,迭代maxOcurrences次,如果需要打印*

for(int i = 0; i < maxOcurrences; i++) 
{ 
    //Iterate over each character again 
    for (Map.Entry<Character, Integer> entry : hm.entrySet()) { 
     if(entry.getValue() > i) 
     { 
      //Print Star 
      System.out.print("*"); 
     }else{ 
      //Print space 
      System.out.print(" "); 
     } 
     System.out.println(); 
    } 
} 
+0

您可以在遍歷按鍵時捕捉第一行的大小寫。這樣你只需要遍歷一次地圖。 – gonzo

+0

@gonzo感謝您的意見!這是真的,但差別並不是那麼大,如果沒有'if's,額外的循環往往會花費更多的CPU。 –