【问题标题】:How to count same words in a string and get the index of the first word that is equal?如何计算字符串中相同的单词并获得第一个相等的单词的索引?
【发布时间】:2014-03-02 16:42:59
【问题描述】:

我的任务是创建一个名为“dupWords”的静态方法,它获取一个字符串作为参数并返回一个单词在同一个字符串中出现的次数。现在要注意的是,我需要将它作为二维数组返回,它有 2 列,行将是字符串中有多少不同的子字符串...

例如:“abcd xyz abcd abcd def xyz”

这将是对 [0][3] [5][2] [19][01] 第一对意味着单词“abcd”出现了 3 次并在索引 0 处声明(你得到休息..)

这是二维数组的图像:(文字是希伯来语,但你可以看到图纸)

我开始了一些事情......你可能会认为它的方式:/(它只是一些开始) 我想我并没有真正理解如何处理二维数组..

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); 
                }
            }
        }
    }

请帮忙, 谢谢

【问题讨论】:

  • 只是问:这是一张用你屏幕上的相机拍的照片,显示 Skitch 正在查看一张用你的纸上的相机拍的照片,上面有一个箭头吗?
  • 我用我的 iPhone(是的,skitch 应用程序)拍了这张照片,是的,它在纸上..@MartijnCourteaux
  • 这对我来说就像 PictureCeption。但我猜 Skitch 应用只是制作颗粒状的箭头?
  • 哦,是的,它是一个标题,然后我在 skitch 中打开它

标签: java arrays


【解决方案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;
}

【讨论】:

  • 但是我会为每个单词创建新的数组...这是我想做什么?
  • 不,在你已经拥有的循环之前,你必须检查唯一单词的数量,然后创建数组,然后运行你的循环
  • 我们还没有在课堂上学习 HashSet 和这种 for(String str : stringArray) ......我们仍然使用更基本的东西
  • 这是我数单词的方式,d.pr/i/5eRQ 它是 droplr 的链接,别担心 :)
  • 很遗憾,您计算唯一词的代码是错误的。首先,不要将字符串与 == 或 != 进行比较,而是使用 equals。其次,您计算的不是唯一词的数量,这两个循环不会给您所需的结果。
【解决方案2】:

使用HashMap 存储每个唯一单词的计数和第一个索引。

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

然后通过stringArray 更改您的循环以仅使用第一个外部循环。您不需要内部循环。

在通过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 映射来构建您的返回数组。我会把它留给你编码。

【讨论】:

  • 与其把代码降到一个较低的水平,我们说什么让你对代码的理解更上一层楼?我的原始答案将HashMap 引用链接到java 类定义页面。我已经对其进行了编辑,使其现在链接到 Map 接口的 oracle 教程页面。
  • 您可以将 HashMap 视为类固醇上的唯一“关联数组”。关联数组只是一个常规数组,它使用字符串值作为键而不是整数索引。所以,而不是array[0],array[1],...您将访问关联数组array['keyvaluea'],array['keyvalueb'],...不同之处在于,HashMap 可以具有任何原始数据类型作为它的键,而不是只是一个字符串。无论您在 &lt;KeyType, ValueType&gt; 参数中指定什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多