2012-08-07 175 views
3

如何根据java中升序的值的出现次数排列数组中的元素。根据出现次数对数组进行升序排序

这是我已经试过:

int a[]={0,0,0,1,3,3,2,1,3,5,6,0}; 
int b=a.length; 
for(int i=0;i<b;i++) { 
    for(int j=0;j<i;j++) { 
     int temp; 
     if(a[j]>a[i]) { 
      temp=a[i]; 
      a[i]=a[j]; 
      a[j]=temp; 
     } 
    } 
} 

for(int r=0;r<a.length;r++) { 
    System.out.println(a[r]); 
} 
+0

你想要什么结果呢? '{0,0,0,0,1,1,2,3,3,3,5,6}'? – 2012-08-07 09:30:20

+0

要建立在以前的评论:你想排序阵列? – Baz 2012-08-07 09:32:06

+0

“基于计数”是什么意思?如果奇数长度上升,如果长度或类似的东西下降? – billdoor 2012-08-07 09:36:36

回答

3

下面是您开始使用一种方法可以基于保持的初始阵列中的每个整数多少次已经出现在地图中的计数的想法。一旦所有的数字都被计算在内,通过递增值的顺序排序的地图,然后打印地图的输出:

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.TreeMap; 

public class SortCount { 
    public static void main(String[] args) { 
     int nums[] = {0,0,0,1,3,3,2,1,3,5,6,0}; 
     HashMap<Integer,Integer> counts = new HashMap<Integer,Integer>(); 

     for(int i = 0; i < nums.length; i++) { 
      if(counts.containsKey(nums[ 
       Integer c = counts.get(nums[i]) + 1; 
       counts.put(nums[i], c); 
      } 
      else { 
       counts.put(nums[i],1); 
      } 
     } 

     ValueComparator<Integer,Integer> bvc = new ValueComparator<Integer,Integer>(counts); 
     TreeMap<Integer,Integer> sortedMap = new TreeMap<Integer,Integer>(bvc); 
     sortedMap.putAll(counts); 

     ArrayList<Integer> output = new ArrayList<Integer>(); 
     for(Integer i : sortedMap.keySet()) { 
      for(int c = 0; c < sortedMap.get(i); c++) { 
       output.add(i); 
      } 
     } 

     System.out.println(output.toString()); 
    } 
} 

它采用了Comparator类的Map的值进行比较:

import java.util.Comparator; 
import java.util.Map; 

public class ValueComparator<T1,T2 extends Comparable<T2>> implements Comparator<T1> { 
    Map<T1,T2> base; 
    public ValueComparator(Map<T1,T2> base) { 
     this.base = base; 
    } 

    @Override 
    public int compare(T1 k1, T1 k2) { 
     T2 val1 = base.get(k1); 
     T2 val2 = base.get(k2); 

     return val1.compareTo(val2); 
    } 
} 
+0

这个程序将不适用于两个数字的频率相同的输入。例如,{5,2,8,8,5,5,8}为 。尝试并运行上面的代码输出将是错误的。 – 2016-04-18 12:53:50

+0

@SumitRathi“工作”的定义从来没有真正确定下来。我记得,这个解决方案完全忽略了数字值,并且根据出现次数完全分类,因此'2,5,5,8,8,8'被认为与'2,8,8 ,8,5,5,5'。如果需要的话,按价值添加第二级排序显然是微不足道的。 – Edd 2016-04-18 13:04:00

+0

我不是在谈论第二级排序。对于这个特定的输入({5,2,8,8,5,5,8}),你的程序将输出为[2,5,5,5]。 尝试并针对此输入运行您的代码。你可以验证它。 – 2016-04-18 17:16:49

3

如果你只是想sort阵列,使用以下命令:

Arrays.sort(a); 

如果你想手动排序的话,我会建议阅读this页面,您可以在其中找到各种排序算法的伪代码。

但是,如果您正在寻找一种基于数字频率对数组进行排序的方法,我会推荐this页面。你将不得不颠倒排序顺序,按照升序排列你想要的顺序。

1
public static void main(String[] args) { 
     int unsortedArray[] = {0,0,0,1,3,3,2,1,3,5,6,0}; 

     System.out.println("After sorting, the list elements are: "); //Just to show you it worked. :) 
     bubbleSoprt(unsortedArray,unsortedArray.length); 
     for(int i =0;i<unsortedArray.length;i++){ 
      System.out.print(unsortedArray[i] + " "); 
     } 
    } 

private static void bubbleSoprt(int []unsortedarray,int lenght){ 
     int temp; 
     for(int counter= 0 ;counter<lenght-1;counter++){ 
      for(int index = 0;index<lenght-1-counter;index++){ 
       if(unsortedarray[index] > unsortedarray[index+1]){ 
        temp = unsortedarray[index]; 
        unsortedarray[index] = unsortedarray[index+1]; 
        unsortedarray[index+1] = temp; 
       } 
      } 

     } 

    } 
1

尝试:

int a[] = {0,0,0,1,3,3,2,1,3,5,6,0}; 
    Arrays.sort(a); 
    System.out.println(Arrays.toString(a)); 
0

下面的程序有点冗长但很容易理解。希望这是你所期待的。

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.LinkedHashMap; 
import java.util.TreeMap; 

public class Test { 

    public static void main(String[] args) { 

     int[] arra = {-2,-2,-2,-1,-1,-1,2,2,1,3,1,9,9,1,1,9,9}; 

     for(int i:sortedArrary(arra)){ 
      System.out.print(i+" "); 
     } 
    } 

    static int[] sortedArrary(int[] inputArray) 
    { 
     TreeMap<Integer,Integer> repetitiveElements = null; 

     if(inputArray==null || inputArray.length<=0) 
      return null; 

     repetitiveElements = new TreeMap<Integer,Integer>(); 
     for(int i=0;i<inputArray.length;i++) 
     { 
      if(repetitiveElements.containsKey(inputArray[i])) 
      { 
       repetitiveElements.put(inputArray[i], repetitiveElements.get(inputArray[i])+1); 
      }else{ 
       repetitiveElements.put(inputArray[i],1); 
      } 
     } 

     //System.out.println("repetitive "+repetitiveElements); 


     ArrayList<Integer> keysArray = new ArrayList<Integer>(repetitiveElements.size()); 
     ArrayList<Integer> valuesArray = new ArrayList<Integer>(repetitiveElements.size()); 
     int key; 
     Iterator<Integer> itr = repetitiveElements.keySet().iterator(); 
     while(itr.hasNext()) 
     { 
      key = itr.next(); 
      keysArray.add(key); 
      valuesArray.add(repetitiveElements.get(key)); 
     } 

     /* 
     System.out.println("keys "+keysArray); 
     System.out.println("values "+valuesArray); 
     */ 
     LinkedHashMap<Integer,Integer> map = new LinkedHashMap<Integer,Integer>(); 
     int maxValue=-1; 
     int maxKey = -1; 
     int pos = -1; 

     for(int i=0;i<repetitiveElements.size();i++) 
     { 
      if(keysArray.get(i)==null) 
       continue; 

      maxKey = keysArray.get(i); 
      maxValue = valuesArray.get(i); 
      pos=i; 
      for(int j=0;j<repetitiveElements.size();j++) 
      { 
       if(valuesArray.get(j)!=null && maxValue>valuesArray.get(j)) 
       { 
        maxValue = valuesArray.get(j); 
        maxKey = keysArray.get(j); 
        pos = j; 
       }else if(valuesArray.get(j)!=null && maxValue==valuesArray.get(j)){ 
        if(keysArray.get(j)!=null && maxKey>keysArray.get(j)) 
        { 
         maxKey = keysArray.get(j); 
         pos = j; 
        } 
       } 
      } 


      map.put(maxKey, maxValue); 
      valuesArray.set(pos, null); 
      keysArray.set(pos, null); 

     } 

     for(int i=0;i<keysArray.size();i++) 
     { 
      if(keysArray.get(i)!=null) 
      { 
       map.put(keysArray.get(i), valuesArray.get(i)); 
      } 
     } 
     itr = map.keySet().iterator(); 
     int count=0,value; 
     while(itr.hasNext()) 
     { 
      key = itr.next(); 
      value = map.get(key); 

      for(int i=0;i<value;i++) 
      { 
       inputArray[count++] = key; 
      } 

     } 
     return inputArray; 
    } 
} 
3

这是一个使用TreeMap来完成它的有效方法。

import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.TreeMap; 

public class FrequencySort { 
    public static void main(String[] args) { 
     int[] ar = new int[] {5,2,8,8,5,5,8,1,9,0,1,1,0,1}; 

     Map<Integer,Integer> numbers = new HashMap<>(); 

     for(int number : ar) { 
      if(numbers.containsKey(number)) { 
       Integer count = numbers.get(number); 
       numbers.put(number, ++count); 
      } else { 
       numbers.put(number,1); 
      } 
     } 

     final class FrequencyComparator implements Comparator<Integer> { 
      Map<Integer,Integer> refMap; 
      public FrequencyComparator(Map<Integer,Integer> base) { 
       this.refMap = base; 
      } 

      @Override 
      public int compare(Integer k1, Integer k2) { 
       Integer val1 = refMap.get(k1); 
       Integer val2 = refMap.get(k2); 

       int num = val1.compareTo(val2) ; 
       // if frequencies are same then compare number itself 
       return num == 0 ? k1.compareTo(k2) : num; 
      } 
     } 

     FrequencyComparator comp = new FrequencyComparator(numbers); 
     TreeMap<Integer,Integer> sortedMap = new TreeMap<Integer,Integer>(comp); 
     sortedMap.putAll(numbers); 
     for(Integer i : sortedMap.keySet()) { 
      int frequencey = sortedMap.get(i); 
      for(int count = 1 ; count <= frequencey ; count++) { 
       System.out.print(i + " "); 
      } 
     } 
    } 
} 
0
import java.io.*; 
import java.lang.*; 
import java.util.*; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 
import java.util.Map.Entry; 

class SortingFrequency 
{ 
    public static void main(String args[]) throws Exception{ 
     int i,j,temp,temp1,count; 
     int []a=new int[10]; 
     int []freq=new int[10]; 
     Scanner s=new Scanner(System.in); 
     for(i=0;i<5;i++){ 
      a[i]=s.nextInt(); 
      freq[i]=-1; 
     } 
     for(i=0;i<5;i++) 
     { 
      count=1; 
      for(j=i+1;j<5;j++) 
      { 
       if(a[i]==a[j]) 
       { 
        count++; 
        freq[j]=0; 
       } 
      } 
      if(freq[i]!=0) 
      { 
       freq[i]=count; 
      } 
     } 
     Map map=new HashMap(); 
     for(i=0;i<5;i++){ 
      if(freq[i]!=0){ 
       map.put(a[i],freq[i]); 
       System.out.println("map elt"+map); 
       System.out.println("a"+a[i]+"fr"+freq[i]); 
      } 
     } 
     Set<Entry<Integer,Integer>> set=map.entrySet(); 
     List<Entry<Integer, Integer>> list = new ArrayList<Entry<Integer, Integer>>(set); 
     Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() 
     { 
      public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) 
      { 
       return (o2.getValue()).compareTo(o1.getValue()); 
      } 
     }); 
     for(Map.Entry<Integer, Integer> entry:list){ 
      System.out.println(entry.getKey()+" ==== "+entry.getValue()); 
     } 
    } 
} 
+0

请格式化代码属性,并添加一些解释代码的功能以及如何解决问题。 – 2016-12-02 18:23:32

1

简单和优化。

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.Set; 

    public class Frequency { 
    public static void main(String[] args) { 
    int array[] = {5,2,8,8,5,5,8,1,1,2}; 
    HashMap<Integer, Integer> data = new HashMap<Integer, Integer>(); 

    for (int i = 0; i < array.length; i++) { 
     if (data.containsKey(array[i])) { 
      Integer count = data.get(array[i]) + 1; 
      data.put(array[i], count); 
     } else { 
      data.put(array[i], 1); 
     } 
    } 

    Set<Entry<Integer, Integer>> set = data.entrySet(); 
    ArrayList<Entry<Integer, Integer>> list = new ArrayList<Entry<Integer, Integer>>(set); 
    Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() { 
     public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) { 
      return (o2.getValue()).compareTo(o1.getValue()); 
     } 
    }); 
    for (Entry<Integer, Integer> entry : list) { 
     System.out.println(entry.getKey() + " <-> " + entry.getValue()); 
    } 

} 
} 
0
package problems; 

import java.util.ArrayList; 
import java.util.Comparator; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.Set; 

public class SortByFrequency { 

    public static void main(String args[]) { 
     int arr[] = { 2, 5, 2, 6, -1, 9999999, 5, 8, 8, 8 }; 
     Map<Integer, Integer> map = new HashMap<Integer, Integer>(); 
     int len = arr.length; 
     for (int j = 0; j < len; j++) { 
      if (map.get(arr[j]) == null) { 
       map.put(arr[j], 1); 
      } else { 
       map.put(arr[j], (Integer) map.get(arr[j]) + 1); 
      } 
     } 

     Set<Entry<Integer, Integer>> set = map.entrySet(); 
     ArrayList<Entry<Integer, Integer>> list = new ArrayList<Entry<Integer, Integer>>(set); 
     list.sort(new Comparator<Entry<Integer, Integer>>() { 
      @Override 
      public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) { 
       if (o1.getValue() < o2.getValue()) { 
        return 1; 
       } else if (o1.getValue() > o2.getValue()) { 
        return -1; 
       } else if (o1.getValue() == o2.getValue()) { 
        if (o1.getKey() < o2.getKey()) { 
         return 1; 
        } else { 
         return -1; 
        } 
       } 
       return 0; 
      } 
     }); 
     for (Map.Entry<Integer, Integer> en : list) { 
      int val = en.getValue(); 
      while(val!=0){ 
      System.out.println(en.getKey()); 
      val--;   
      } 
     } 
    } 

} 
0
public class SortBasedOnFrequency { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     String[] arr = new String[] { "abc", "def", "qas", "abc", "abc", "def" }; 

     new SortBasedOnFrequency().sort(arr); 
    } 

    void sort(String[] a) { 
     Map<String, Integer> map = new HashMap<>(); 
     for (String s : a) { 
//convert array to map putting key as the array element and value as the 
//number of occurence. 
      map.put(s, map.get(s) == null ? 1 : map.get(s) + 1); 
     } 

    List<Map.Entry<String, Integer>> mapEntryList = new ArrayList<>map.entrySet());// sort mapEntry list based on value 
     Collections.sort(mapEntryList, new Comparator<Map.Entry<String, Integer>>() { 

      @Override 
      public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { 
       // TODO Auto-generated method stub 
       return o1.getValue().compareTo(o2.getValue()); 
      } 
     }); 
//print the object in sorting order of the occurrence. 
     for (Entry<String, Integer> m : mapEntryList) { 
      System.out.println(m.getKey() + " " + m.getValue()); 
     } 
    } 

} 
+0

请考虑添加一段文字说明代码的作用。 – MikaS 2018-01-30 10:38:25

相关问题