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

标签 java arrays elements 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,您的生活会更好。这是没有审核员的情况:

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/

相关文章:

arrays - Go中这两种 “slice copy”方法有什么区别

java - 当按钮没有名称或ID时,如何将其用作click()方法的参数?

arrays - 在matlab中查找数组中遵循某个值的元素

java - 如何根据最终局部变量在匿名内部类中设置条件断点?

java - 为每篇文章创建一个唯一的 html 文件是一种好习惯吗?

java - While循环问题(Java)

java - 从不同的类访问变量

c++ - 给定一个整数数组,将数组从中间分成两个短裤数组的最有效方法是什么?

javascript - 获取json数组中元素的最后一个索引

css -::moz-selection不适用于输入元素