【问题标题】:Java count occurrence of each item in an arrayJava 计算数组中每个项目的出现次数
【发布时间】:2011-12-27 06:27:53
【问题描述】:

有什么方法可以计算数组中每一项的出现次数吗?

假设我有:

String[] array = {"name1","name2","name3","name4", "name5"};

这里的输出将是:

name1 1
name2 1
name3 1
name4 1
name5 1

如果我有:

String[] array = {"name1","name1","name2","name2", "name2"};

输出将是:

name1 2
name2 3

这里的输出只是为了演示预期的结果。

【问题讨论】:

  • 可能不会,但考虑到任务的简单程度,它应该足够简单,您可以自己实现一个方法。不管我怎么想,它都会在 O(n) 中执行(除非你对排序做出一些假设以提高这个速度)

标签: java arrays count


【解决方案1】:

您可以使用来自 Google Collections/Guava 的 MultiSet 或来自 Apache Commons 的 Bag

如果你有一个集合而不是一个数组,你可以使用addAll()将整个内容添加到上面的数据结构中,然后对每个值应用count()方法。 SortedMultiSetSortedBag 将按照定义的顺序为您提供项目。

Google Collections 实际上有非常方便的方法可以从数组转到 SortedMultiset

【讨论】:

  • 包的链接是404。
  • 我使用了来自 org.apache.commons.collections.CollectionUtils 的 getCardinalityMap()。
【解决方案2】:

我会使用哈希表,其中 in 键获取数组元素(此处为字符串),值是整数。

然后通过列表做这样的事情:

for(String s:array){
if(hash.containsKey(s)){
  Integer i = hash.get(s);
  i++;
}else{
  hash.put(s, new Interger(1));
}

【讨论】:

  • 这不起作用,你必须使用hash.put(s, hash.get(s) + 1);。执行i++; 不会更新哈希表中的整数。还有其他错别字。
【解决方案3】:

您可以使用 HashMap,其中 Key 是您的字符串和值 - 计数。

【讨论】:

    【解决方案4】:

    我为此编写了一个解决方案来练习自己。它似乎不像发布的其他答案那么棒,但无论如何我都会发布它,然后学习如何使用其他方法来做到这一点。享受:

    public static Integer[] countItems(String[] arr)
    {
        List<Integer> itemCount = new ArrayList<Integer>();
        Integer counter = 0;
        String lastItem = arr[0];
    
        for(int i = 0; i < arr.length; i++)
        {
            if(arr[i].equals(lastItem))
            {
                counter++;
            }
            else
            {
                itemCount.add(counter);
                counter = 1;
            }
            lastItem = arr[i];
        }
        itemCount.add(counter);
    
        return itemCount.toArray(new Integer[itemCount.size()]);
    }
    
    public static void main(String[] args)
    {
        String[] array = {"name1","name1","name2","name2", "name2", "name3",
                "name1","name1","name2","name2", "name2", "name3"};
        Arrays.sort(array);
        Integer[] cArr = countItems(array);
        int num = 0;
        for(int i = 0; i < cArr.length; i++)
        {
            num += cArr[i]-1;
            System.out.println(array[num] + ": " + cArr[i].toString());
        }
    }
    

    【讨论】:

    • 它不适用于这样的数组:String[] array = { "Gates", "Michael","Gates","Peterson","Bush","Johnson","Johnson ","盖茨"};
    【解决方案5】:

    您可以使用下面示例中给出的哈希映射:

    import java.util.HashMap;
    import java.util.Set;
    
    /**
     * 
     * @author Abdul Rab Khan
     * 
     */
    public class CounterExample {
        public static void main(String[] args) {
            String[] array = { "name1", "name1", "name2", "name2", "name2" };
            countStringOccurences(array);
        }
    
        /**
         * This method process the string array to find the number of occurrences of
         * each string element
         * 
         * @param strArray
         *            array containing string elements
         */
        private static void countStringOccurences(String[] strArray) {
            HashMap<String, Integer> countMap = new HashMap<String, Integer>();
            for (String string : strArray) {
                if (!countMap.containsKey(string)) {
                    countMap.put(string, 1);
                } else {
                    Integer count = countMap.get(string);
                    count = count + 1;
                    countMap.put(string, count);
                }
            }
            printCount(countMap);
        }
    
        /**
         * This method will print the occurrence of each element
         * 
         * @param countMap
         *            map containg string as a key, and its count as the value
         */
        private static void printCount(HashMap<String, Integer> countMap) {
            Set<String> keySet = countMap.keySet();
            for (String string : keySet) {
                System.out.println(string + " : " + countMap.get(string));
            }
        }
    }
    

    【讨论】:

      【解决方案6】:

      这是我的解决方案 - 该方法将整数数组(假设范围在 0 到 100 之间)作为输入,并返回每个元素的出现次数。

      假设输入是[21,34,43,21,21,21,45,65,65,76,76,76]。 所以输出将在地图中,它是:{34=1, 21=4, 65=2, 76=3, 43=1, 45=1}

      public Map<Integer, Integer> countOccurrence(int[] numbersToProcess) {
          int[] possibleNumbers = new int[100];
          Map<Integer, Integer> result = new HashMap<Integer, Integer>();
      
          for (int i = 0; i < numbersToProcess.length; ++i) {
            possibleNumbers[numbersToProcess[i]] = possibleNumbers[numbersToProcess[i]] + 1;
            result.put(numbersToProcess[i], possibleNumbers[numbersToProcess[i]]);
          }
      
          return result;
      }
      

      【讨论】:

        【解决方案7】:
        List asList = Arrays.asList(array);
        Set<String> mySet = new HashSet<String>(asList);
        
        for(String s: mySet){
         System.out.println(s + " " + Collections.frequency(asList,s));
        }
        

        【讨论】:

        • 根据我的经验,Collections.frequency 太慢了。如果性能是一个问题,请避免。
        • 不是真的,如果它是 HashSet 或 HashMap。
        【解决方案8】:

        有几种方法可以提供帮助,但这是一种使用 for 循环的方法。

        import java.util.Arrays;
        
        public class one_dimensional_for {
        
        private static void count(int[] arr) {
        
            Arrays.sort(arr);
        
            int sum = 0, counter = 0;
        
            for (int i = 0; i < arr.length; i++) {
                if (arr[0] == arr[arr.length - 1]) {
                    System.out.println(arr[0] + ": " + counter + " times");
                    break;
                } else {
                    if (i == (arr.length - 1)) {
                        sum += arr[arr.length - 1];
                        counter++;
                        System.out.println((sum / counter) + " : " + counter
                                + " times");
                        break;
                    } else {
                        if (arr[i] == arr[i + 1]) {
                            sum += arr[i];
                            counter++;
                        } else if (arr[i] != arr[i + 1]) {
                            sum += arr[i];
                            counter++;
                            System.out.println((sum / counter) + " : " + counter
                                    + " times");
                            sum = 0;
                            counter = 0;
                        }
                    }
                }
            }
        }
        
        public static void main(String[] args) {
            int nums[] = { 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 5, 5, 5, 5, 6 };
            count(nums);
        }
        
        }
        

        【讨论】:

          【解决方案9】:

          使用,您可以这样做:

          String[] array = {"name1","name2","name3","name4", "name5", "name2"};
          Arrays.stream(array)
                .collect(Collectors.groupingBy(s -> s))
                .forEach((k, v) -> System.out.println(k+" "+v.size()));
          

          输出:

          name5 1
          name4 1
          name3 1
          name2 2
          name1 1
          

          它的作用是:

          • 从原始数组创建Stream&lt;String&gt;
          • 按标识对每个元素进行分组,得到Map&lt;String, List&lt;String&gt;&gt;
          • 对于每个键值对,打印键和列表的大小

          如果你想得到一个包含每个单词出现次数的Map,可以这样做:

          Map<String, Long> map = Arrays.stream(array)
              .collect(Collectors.groupingBy(s -> s, Collectors.counting()));
          

          更多信息:

          希望对您有所帮助! :)

          【讨论】:

            【解决方案10】:

            您可以使用 Arrays.sort 和 Recursion 来实现。同样的酒,但在不同的瓶子里......

            import java.util.Arrays;
            
            public class ArrayTest {
            public static int mainCount=0;
            
            public static void main(String[] args) {
                String prevItem = "";
                String[] array = {"name1","name1","name2","name2", "name2"};
                Arrays.sort(array);
            
                for(String item:array){
                    if(! prevItem.equals(item)){
                        mainCount = 0;
                        countArray(array, 0, item);
                        prevItem = item;
                    }
                }
            }
            
            private static void countArray(String[] arr, int currentPos, String item) {
                if(currentPos == arr.length){
                    System.out.println(item + " " +  mainCount);
                    return;
                }
                else{
                    if(arr[currentPos].toString().equals(item)){
                        mainCount += 1;
                    }
                    countArray(arr, currentPos+1, item);
                }
              }
            }
            

            【讨论】:

              【解决方案11】:
              import java.util.ArrayList;
              import java.util.Arrays;
              import java.util.HashMap;
              import java.util.List;
              
              public class MultiString {
              
                  public HashMap<String, Integer> countIntem( String[] array ) {
              
                      Arrays.sort(array);
                      HashMap<String, Integer> map = new HashMap<String, Integer>();
                      Integer count = 0;
                      String first = array[0];
                      for( int counter = 0; counter < array.length; counter++ ) {
                          if(first.hashCode() == array[counter].hashCode()) {
                              count = count + 1;
                          } else {
                              map.put(first, count);
                              count = 1;
                          }
                          first = array[counter];
                          map.put(first, count);
                      }
              
                      return map;
                  }
              
                  /**
                   * @param args
                   */
                  public static void main(String[] args) {
                      // TODO Auto-generated method stub
                      String[] array = { "name1", "name1", "name2", "name2", "name2",
                              "name3", "name1", "name1", "name2", "name2", "name2", "name3" };
              
                      HashMap<String, Integer> countMap = new MultiString().countIntem(array);
                      System.out.println(countMap);
                  }
              }
              
              
              
              Gives you O(n) complexity.
              

              【讨论】:

              • 你可能想对你的代码做一些解释。
              【解决方案12】:

              这是我在 Python 中使用的一个简单脚本,但它很容易适应。不过没什么特别的。

              def occurance(arr):
                results = []
                for n in arr:
                    data = {}
                    data["point"] = n
                    data["count"] = 0
                    for i in range(0, len(arr)):
                        if n == arr[i]:
                            data["count"] += 1
                    results.append(data)
                return results
              

              【讨论】:

                【解决方案13】:

                你可以通过简单的技术找到使用HashMap

                public class HashMapExample {
                    public static void main(String[] args) {
                        stringArray();          
                    }
                public static void stringArray()
                {
                    String[] a = {"name1","name2","name3","name4", "name5"};
                
                    Map<String, String> hm = new HashMap<String, String>();
                    for(int i=0;i<a.length;i++)
                    {
                    String bl=(String)hm.get(a[i]);
                    if(bl==null)
                    {
                        hm.put(a[i],String.valueOf(1));
                    }else
                    {
                        String k=hm.get(a[i]);
                        int j=Integer.valueOf(k);
                        hm.put(a[i],String.valueOf(j+1));
                    }
                
                    }
                    //hm.entrySet();
                    System.out.println("map elements are "+hm.toString());
                }
                
                }
                

                【讨论】:

                  【解决方案14】:

                  // 不使用 Hashset 或 map 或 Arraylist 的答案

                  public class Count {
                      static String names[] = {"name1","name1","name2","name2", "name2"};
                      public static void main(String args[]) {
                  
                          printCount(names);
                  
                      }
                  
                      public static void printCount(String[] names){
                  
                          java.util.Arrays.sort(names);
                          int n = names.length, c;
                          for(int i=0;i<n;i++){
                              System.out.print(names[i]+" ");
                          }
                          System.out.println();
                          int result[] = new int[n];
                          for(int i=0;i<n;i++){
                              result[i] = 0;
                          }
                  
                          for(int i =0;i<n;i++){
                              if (i != n-1){
                                  for(int j=0;j<n;j++){
                                      if(names[i] == names[j] )
                                          result[i]++;
                                  }
                              }
                              else if (names[n-2] == names[n-1]){
                              result[i] = result[i-1];
                           }
                  
                           else result[i] = 1;
                          }
                          int max = 0,index = 0;
                          for(int i=0;i<n;i++){
                           System.out.print(result[i]+"     ");
                              if (result[i] >= max){
                                  max = result[i];
                                  index = i;
                              }
                  
                          }
                      }
                  }
                  

                  【讨论】:

                    【解决方案15】:

                    使用 HashMap 就像在公园里散步一样。

                    main(){
                        String[] array ={"a","ab","a","abc","abc","a","ab","ab","a"};
                        Map<String,Integer> hm = new HashMap();
                    
                        for(String x:array){
                    
                            if(!hm.containsKey(x)){
                                hm.put(x,1);
                            }else{
                                hm.put(x, hm.get(x)+1);
                            }
                        }
                        System.out.println(hm);
                    }
                    

                    【讨论】:

                    • 这行得通,但无法解释 hm.put(x, hm.get(x)+1);部分 ?谢谢
                    • 我的意思是 hm.get(x) 实际上如何像一个计数器而不是项目值?
                    • @ikel 如果密钥(在本例中为 x)已经存在于 hm 中,则获取相应的值,加一并存储回来。
                    【解决方案16】:

                    可以使用集合以非常简单的方式完成 请在下面找到代码

                    String[] array = {"name1","name1","name2","name2", "name2"};
                    List<String> sampleList=(List<String>) Arrays.asList(array);
                    for(String inpt:array){
                    int frequency=Collections.frequency(sampleList,inpt);
                    System.out.println(inpt+" "+frequency);
                    }
                    

                    这里的输出会像 名称 1 2 名称 1 2 名称2 3 名称2 3 名称2 3

                    为避免打印冗余键,请使用 HashMap 并获得所需的输出

                    【讨论】:

                    • 我们也可以将上面的sampleList传递给TreeSet的构造函数,然后循环获取结果
                    【解决方案17】:

                    使用 hashmap、流和集合计算字符串出现次数

                    import java.util.Arrays;
                    import java.util.Collections;
                    import java.util.HashMap;
                    import java.util.HashSet;
                    import java.util.List;
                    import java.util.Map;
                    import java.util.Set;
                    import java.util.stream.Collectors;
                    
                    public class StringOccurence {
                    
                    public static void main(String args[]) {
                    
                        String[] stringArray = { "name1", "name1", "name2", "name2", "name2" };
                        countStringOccurence(stringArray);
                        countStringOccurenceUsingStream(stringArray);
                        countStringOccurenceUsingCollections(stringArray);
                    }
                    
                    private static void countStringOccurenceUsingCollections(String[] stringArray) {
                        // TODO Auto-generated method stub
                        List<String> asList = Arrays.asList(stringArray);
                        Set<String> set = new HashSet<String>(asList);
                        for (String string : set) {
                            System.out.println(string + "   -->   " + Collections.frequency(asList, string));
                        }
                    
                    }
                    
                    private static void countStringOccurenceUsingStream(String[] stringArray) {
                        // TODO Auto-generated method stub
                        Arrays.stream(stringArray).collect(Collectors.groupingBy(s -> s))
                                .forEach((k, v) -> System.out.println(k + "   -->   " + v.size()));
                    }
                    
                    private static void countStringOccurence(String[] stringArray) {
                        // TODO Auto-generated method stub
                        Map<String, Integer> map = new HashMap<String, Integer>();
                        for (String s : stringArray) {
                            if (map.containsKey(s)) {
                                map.put(s, map.get(s) + 1);
                            } else {
                                map.put(s, 1);
                            }
                        }
                    
                        for (Map.Entry<String, Integer> entry : map.entrySet()) {
                            System.out.println(entry.getKey() + "   -->   " + entry.getValue());
                        }
                    
                    }
                    

                    }

                    【讨论】:

                      【解决方案18】:
                      public class Main
                      {
                          public static void main(String[] args) {
                              
                              String[] a ={"name1","name1","name2","name2", "name2"};
                              for (int i=0;i<a.length ;i++ )
                              {
                                  int count =0;
                                  int count1=0;
                                  for(int j=0;j<a.length;j++)
                                  {
                                      if(a[i]==a[j])
                                      {
                                          count++;
                                          
                                      }
                                  }
                                  for(int j=i-1;j>=0 ;j--)
                                  {
                                      if(a[i]==a[j])
                                      {
                                          count1++;
                                      }
                                  }
                                  if(count1 ==0)
                                  {
                                      System.out.println(a[i]+" occurs :"+count);
                                  }
                              }
                          }
                      }
                      

                      【讨论】:

                        【解决方案19】:

                        你可以使用

                        for (String x : array){
                           System.out.println(Collections.frequency(array,x));
                        }
                        

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2012-07-23
                          • 1970-01-01
                          • 2014-10-16
                          • 2014-03-18
                          • 1970-01-01
                          • 2017-03-24
                          • 2015-06-19
                          相关资源
                          最近更新 更多