2014-02-05 62 views
1

我的任務是創建一個名爲「dupWords」的靜態方法,它獲取一個字符串作爲參數,並返回一個單詞處於同一個字符串的次數。現在需要注意的是,我需要將它作爲一個二維數組返回,它具有2列,並且行將有多少個不同的子字符串在字符串中...如何計算一個字符串中的相同單詞並獲得相同的第一個單詞的索引?

例如:「abcd xyz abcd abcd def xyz「

這將成對[0] [3] [5] [2] [19] [01]表示單詞」abcd「出現3次並且在索引0 (和其他的你買..)

這是二維數組的圖像:(文字是希伯來文,但你可以看到圖)

enter image description here

我開始什麼......你可能會認爲它的路要走:/(它只是一些開始) 我想我真的不知道如何處理二維數組..

public static int[][] dupWords (String str) { 

     String [] stringArray = str.split(" "); 
     int countWords = 0; 
     int index = 0; 
     int [][] retArr; 

     for (int i = 0; i < stringArray.length; i++) { 
      for (int j = 0; j < stringArray.length; j++) { 
       if (stringArray[i].equalsIgnoreCase(stringArray[j])){ 
        countWords++; 
        index = stringArray[i].indexOf(str); 
       } 
      } 
     } 
    } 

請幫幫忙, thankss

+0

只是問:用屏幕上的相機制作的照片是否顯示Skitch查看使用相紙製作的圖片,並在其上方有箭頭? –

+0

我把這張照片與我的iPhone(是的,skitch應用程序)和是它在紙上.. @ MartijnCourteaux – JohnBigs

+0

這感覺就像* PictureCeption *給我。但我猜想Skitch應用程序只是製作粒狀箭頭? –

回答

1

找到的唯一字的數量。

你可以做到這一點,將stringArray中的所有單詞放在一個hashmap中。哈希映射稍後會派上用場。

創建一個像這樣的數組retArr = new int [unique] [2];下面

完整的解決方案(注意,我甚至沒有編譯!)現在

public static int[][] dupWords (String str) { 

    String [] stringArray = str.split(" "); 
    int countWords = 0; 
    int index = 0; 
    HashMap<String, Integer> indexMap = new HashMap<String, Integer>(); 
    HashMap<String, Integer> countMap = new HashMap<String, Integer>(); 

    int index = 0; 
    for (int i = 0; i < stringArray.size(); i++) { 
     String s = stringArray[i]; 
     if (!indexMap .containsKey(s)) { 
     indexMap.put(s, index); 
     countMap.put(s, 1); 
     } 
     else { 
     int cnt = countMap.get(s); 
     countMap.put(s, cnt+1); 
     } 
     index += s.length() + 1; 
    } 

    int [][] retArr = new int[map.size()][2]; 

    for (int i = 0; i < stringArray.size(); i++) { 
     String s = stringArray[i]; 
     retArr[i][0] = indexMap.get(s); 
     retArr[i][1] = countMap.get(s); 
    } 

    return retArr; 
} 

,沒有HashMap的,或其他任何動力結構這是相當困難的事。最簡單的方法是創建一個更大的數組,並在最後修剪它。這可能看起來像這樣。

public static int[][] dupWords (String str) { 

    String [] stringArray = str.split(" "); 
    int countWords = 0; 
    int index = 0; 

    int [][] retArr = new int[stringArray.size()][2]; 

    int uniqeWords = 0; 
    for (int i = 0; i < stringArray.size(); i++) { 
     String s = stringArray[i]; 
     if (s != null) { 
     retArr[uniqueWords][0] = str.indexOf(s); 
     int cnt = 1; 
     for (int j = i + 1; j < stringArray.size(); j++) { 
      if (s.equalsIgnoreCase(stringArray[j])) { 
      stringArray[j] = null; 
      cnt++; 
      } 
     } 
     retArr[uniqueWords][1] = cnt; 
     uniqueWords++; 
     } 
    } 

    int[][] newRetArr = new int[uniqueWords][2]; 
    for (int i = 0; i < uniqueWords; i++) { 
     newRetArr[i][0] = retArr[i][0]; 
     newRetArr[i][1] = retArr[i][1]; 
    } 

    return newRetArr; 
} 
+0

,但然後我會爲每個單詞創建新的數組...這是我想要做的? – JohnBigs

+0

不,在你已經有的循環之前,你必須檢查一些獨特的單詞,然後創建數組,然後運行你的循環 – ciamej

+0

哦...我會試試這個,謝謝 – JohnBigs

0

使用HashMap來存儲每個唯一字的計數和第一個索引。

Map<String, Map<String, int>> uniqueWords = new HashMap<>(); 

然後通過stringArray更改您的循環僅使用第一外環。你不需要內部循環。

通過字符串數組每次迭代中,做

if(!uniqueWords.get(stringArray[i])) { 
    uniqueWords.put(stringArray[i], new HashMap<String, int>()); 
    uniqueWords.get(stringArray[i]).put("Count", 0); 
    uniqueWords.get(stringArray[i]).put("Index", str.indexOf(stringArray[i])); 
} 

uniqueWords.get(stringArray[i]).get("Count")++; 

然後,您可以使用uniqueWords映射到建立你的回報陣列。我會留下給你的代碼。

+0

我需要更多基本代碼的幫助.. – JohnBigs

+0

而不是將代碼降低到更低的水平,我們說你提高了對代碼的理解到更高的水平?我的原始答案將'HashMap'引用鏈接到java類定義頁面。我已經編輯它,現在它鏈接到'Map'接口的oracle教程頁面。 –

+1

您可以將HashMap視爲類固醇上唯一的「關聯數組」。關聯數組只是一個常規數組,它使用字符串值,因爲它是鍵而不是整數索引。因此,你可以使用array ['keyvaluea''''''array ['keyvalueb']'來訪問一個關聯數組,而不是'array [0]'...不同之處在於,HashMap可以具有任何原始數據類型,因爲它是關鍵,而不僅僅是一個字符串。無論你在'參數中指定了什麼。 –

相關問題