如何检查数组中的元素是否根据出现的次数排序?

时间:2017-09-11 01:09:54

标签: java arrays list sorting

我想检查数组中的元素是否根据其出现次数进行排序。这假设它们已经在元素相同的情况下进行了分组。 int [] y = {7, 7, 7, 8, 8, 5, 5, 5, 5}应该返回falseint [] y = {5, 5, 5, 5, 7, 7, 7, 8, 8}应该返回true。有四个5,三个7和两个8,所以它应该这样安排。

这是我到目前为止所做的:

import java.io.*;
import java.util.*;


public class testing2 {

  public static void main(String[] args){
    int [] y = {7, 7, 7, 8, 8, 5, 5, 5, 5};
    System.out.println(isSorted(y));  // should return false

  }

  public static boolean isSorted(int[] y){

    HashMap<Integer,Integer> hash = new HashMap<Integer,Integer>();

    for(int i=0; i<y.length; i++){
      if(hash.containsKey(y[i])){
        hash.put(y[i], hash.get(y[i]) + 1);
      } else {
        hash.put(y[i], 1);
      }
    }
    System.out.println(hash);
    return true;  // code is not complete yet
  }
}

它会打印出来:

{5=4, 7=3, 8=2}
true

所以现在我有每个元素的出现次数。我接下来该怎么办?

2 个答案:

答案 0 :(得分:1)

你可以在一次数组传递中解决这个问题;这里有一些提示:

在迭代数组时,跟踪当前number(例如5,7或8)和quantity。完成下一组number后,请将其与之前的number / quantity进行比较。然后,适当地返回true或false。

答案 1 :(得分:1)

如果您希望保留使用HashMap的方向,则有一种方法可以继续:

  • 改为使用LinkedHashMap,因此当您通过地图进行迭代时,您将按照将其放入地图的顺序进行迭代
  • 通过地图迭代,看看每个条目是否有<个上一个条目。伪代码:

    int prevCount = MAX_INT;
    for (entry : map) {
        currentCount = entry.getValue()
        if (currentCount > prevCount) {
            return false
        }
        prevCount = currentCount
    }
    return true;
    

或者,您可以在阵列上进行一次单次传递(伪代码):

 prevCount = MAX_INT
 currentCount = 0;
 for (i = 0...array.length) {
     increment currentCount 

     // if i points to last number in group
     if (i is the last element of array, OR
             next element is not equals to current element) {
         if currentCount > prevCount {
             return false;
         }
         prevCount = currentCount;
         currentCount = 0;
     }
}