java - 计算数组中元素的出现次数? ( java )

标签 java arrays element find-occurrences

我已经花了大约 6 个小时来尝试找出这个算法,但似乎无法想出解决方案。我正在尝试计算数组中元素的出现次数,并且可能还有两个单独的数组。一种用于唯一实例,另一种用于这些实例发生的次数。我在这里发现了一些关于数组列表和 hashMap 的其他想法,但我只能使用数组。

例如,我有这个数组(已经排序):

{cats, cats, cats, dog, dog, fish}

我正在尝试为实例创建一个数组,所以:

{cats, dog, fish}

最后,这些情况发生了多少次:

{3, 2, 1}

这是我到目前为止的代码:

public void findArrs( String[] words )
{
  int counter = 1;
  for(int i = 0; i < words.length - 1; i++){
  if(!(words[i].equals(words[i+1]))){
  counter++; 
  }
 }

 String[] unique = new String[counter];
 int[] times = new int[counter];

 for(int i = 0; i < words.length; i++){

   }    
}

这是我经过所有尝试后得到的所有代码。

最佳答案

这就是仅使用数组即可完成的方法。棘手的部分是您必须在创建数组之前知道项目的数量。所以我必须创建自己的函数来创建更大的数组。实际上有两种,一种用于计数,一种用于唯一值。

如果您可以使用 vector ,您会过得更好。这是没有 vector 的:

public class HelloWorld{

     public static void main(String []args){
        String[] initalArray;

        // allocates memory for 10 integers
        initalArray = new String[6];
        initalArray[0] = "cats";
        initalArray[1] = "cats";
        initalArray[2] = "cats";
        initalArray[3] = "dog";
        initalArray[4] = "dog";
        initalArray[5] = "fish";

        String[] uniqueValues = new String[0];
        int[] countValues = new int[0];
        for(int i = 0; i < initalArray.length; i++)
        {
            boolean isNewValue = true;
            for (int j = 0; j < uniqueValues.length; j++)
            {
                if (uniqueValues[j] == initalArray[i])
                {
                    isNewValue = false;
                    countValues[j]++;
                }
            }

            if (isNewValue)
            {
                // We have a new value!
                uniqueValues = addToArrayString(uniqueValues, initalArray[i]);
                countValues = addToArrayInt(countValues, 1);
            }
        }

        System.out.println("Results:");
        for(int i = 0; i < countValues.length; i++)
        {
            System.out.println(uniqueValues[i] + "=" +  countValues[i]);
        }
     }

     public static String[] addToArrayString(String[] initalArray, String newValue)
     {
         String[] returnArray = new String[initalArray.length+1];
         for(int i = 0; i < initalArray.length; i++)
         {
             returnArray[i] = initalArray[i];
         }
         returnArray[returnArray.length-1] = newValue;

         return returnArray;
     }

     public static int[] addToArrayInt(int[] initalArray, int newValue)
     {
         int[] returnArray = new int[initalArray.length+1];
         for(int i = 0; i < initalArray.length; i++)
         {
             returnArray[i] = initalArray[i];
         }
         returnArray[returnArray.length-1] = newValue;

         return returnArray;
     }
}

正如评论中提到的,如果我们知道数组是有序的,那么我们就不需要搜索整个先前的数组,而可以直接检查 uniqueValues 。

public class HelloWorld{

     public static void main(String []args){
        String[] initalArray;

        // allocates memory for 10 integers
        initalArray = new String[6];
        initalArray[0] = "cats";
        initalArray[1] = "cats";
        initalArray[2] = "cats";
        initalArray[3] = "dog";
        initalArray[4] = "dog";
        initalArray[5] = "fish";

        String[] uniqueValues = new String[0];
        int[] countValues = new int[0];
        for(int i = 0; i < initalArray.length; i++)
        {
            boolean isNewValue = true;
            if (i > 0)
            {
                if (uniqueValues[uniqueValues.length-1] == initalArray[i])
                {
                    isNewValue = false;
                    countValues[uniqueValues.length-1]++;
                }
            }

            if (isNewValue)
            {
                // We have a new value!
                uniqueValues = addToArrayString(uniqueValues, initalArray[i]);
                countValues = addToArrayInt(countValues, 1);
            }
        }

        System.out.println("Results:");
        for(int i = 0; i < countValues.length; i++)
        {
            System.out.println(uniqueValues[i] + "=" +  countValues[i]);
        }
     }

     public static String[] addToArrayString(String[] initalArray, String newValue)
     {
         String[] returnArray = new String[initalArray.length+1];
         for(int i = 0; i < initalArray.length; i++)
         {
             returnArray[i] = initalArray[i];
         }
         returnArray[returnArray.length-1] = newValue;

         return returnArray;
     }

     public static int[] addToArrayInt(int[] initalArray, int newValue)
     {
         int[] returnArray = new int[initalArray.length+1];
         for(int i = 0; i < initalArray.length; i++)
         {
             returnArray[i] = initalArray[i];
         }
         returnArray[returnArray.length-1] = newValue;

         return returnArray;
     }
}

关于java - 计算数组中元素的出现次数? ( java ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21228384/

相关文章:

java - 创建集合数组

java - jsoup:向后遍历 Element 类型的对象

java.net.URI 获取带下划线的主机

java - Restful WS 中的依赖注入(inject)

java - GWT 默认请求传输 : when/why to extend?

arrays - 更新 mongodb 中的嵌套数组

java - 为什么程序不能通过这些断言?

java - 从类名数组创建类

forms - 在 Zend Framework2 中使用表单而不是字段集的带有集合元素的 Zend 表单示例

javascript - 从 Google 应用程序脚本中的 UrlFetchApp.Fetch() 获取响应并在 Logger 上打印