Java 按频率排序

Java 按频率排序,java,sorting,Java,Sorting,在我的一个作业中,我对这个问题有异议。我花了几个小时试图找出一个解决办法,但似乎我做错了什么 我需要根据数字的频率对数组进行排序,例如 [-1.1,-1.1,2.4,-3.0,4.0,2.4,-1.1,-3.0]=>[-1.1,-1.1,2.4,2.4,-3.0,4.0] [-0.5,4.0,6.5,6.5,4.0,-0.5]=>[-0.5,-0.5,4.0,4.0,6.5,6.5] 我试着做的是创建一个名为count()的函数 此函数检查double在数组中出现的次数,然后返回该数量 然后我做

在我的一个作业中,我对这个问题有异议。我花了几个小时试图找出一个解决办法,但似乎我做错了什么

我需要根据数字的频率对数组进行排序,例如

[-1.1,-1.1,2.4,-3.0,4.0,2.4,-1.1,-3.0]=>[-1.1,-1.1,2.4,2.4,-3.0,4.0]

[-0.5,4.0,6.5,6.5,4.0,-0.5]=>[-0.5,-0.5,4.0,4.0,6.5,6.5]

我试着做的是创建一个名为count()的函数 此函数检查double在数组中出现的次数,然后返回该数量

然后我做了一个函数:

公共静态无效sortByFreq(双[]arr)

publicstaticvoidsortbyfreq(double[]arr)
{   
双温;
对于(int i=0;icount(arr,arr[j]))
{
//如果其中一个出现次数更多(其计数更大),则进行交换
温度=arr[i];
arr[i]=arr[j];
arr[j]=温度;
}
}
}
对于(int i=0;i
使用这种方法,我得到了一个不完整的答案,例如,第一个例子很好,打印正确

第二张是打印的 [-0.5,4.0,6.5,6.5,4.0,-0.5]=>[-0.5,4.0,6.5,6.5,4.0,-0.5]

正如你所看到的,4.0和6.5是混合的。我如何解决这个问题?也许我应该试试完全不同的东西


编辑:我不知道如何使用链表,我不确定我们是否可以使用我们所学之外的任何东西。

一种策略是计算元素的二维数组的发生次数,并对新数组进行排序

对于2D数组,我声明了一个class Element.java

public class Element{ 

    public int count;
    public int index;
    public double val;

    public Element(int index, int count , double val){
        this.count = count;
        this.index = index;
        this.val = val;
    }

}
按频率对数组排序的主要算法如下所示

public static void sortByFrequency(double arr[]) {
    Element[] elements = new Element[arr.length];
    for (int i = 0; i < elements.length; i++)
        elements[i] = new Element(i,0,arr[i]);

    /* Count occurrences of remaining elements */
    for (int i = 0; i < arr.length; i++) {
        for(int j = 0; j < arr.length; j++){
            if(elements[i].val == elements[j].val)
                elements[i].count++;
        }
    }
    /* sort on the basis of count and in case of tie use index
    to sort.*/
    Arrays.sort(elements, new Comparator<Element>() {
        @Override
        public int compare(Element o1, Element o2) {
            if (o1.count > o2.count) return -1;
            else if (o1.count < o2.count) return 1;
            // tie breaker
            if(o1.count == o2.count ){
                if (o1.val > o2.val) return -1;
                else if (o1.val < o2.val) return 1;
            }
            return 0;
        }
    });

    for (int i = 0; i < arr.length; i++)
        arr[i] = elements[i].val;
}
公共静态无效排序频率(双arr[]{
元素[]元素=新元素[arr.length];
for(int i=0;io2.count)返回-1;
否则如果(o1.counto2.val)返回-1;
否则如果(o1.val
发生这种情况是因为你得到两个频率相同的不同数字。如果频率相等,则必须比较数字本身。只需将您的
if
条件从排序更改为:

if(count(arr, arr[i]) >= count(arr, arr[j]) && arr[i] < arr[j]) {           
       temp = arr[i];
       arr[i] = arr[j];
       arr[j] = temp;
}
if(count(arr,arr[i])>=count(arr,arr[j])&&arr[i]
嘿,这不完全正确。[-0.5,4.0,6.5,6.5,4.0,-0.5]=>[-0.5,-0.5,4.0,4.0,6.5,6.5]但我得到了[6.5,6.5,4.0,4.0,-0.5,-0.5],我忘了提到它们应该按谁来排序first@michellefanter这是一个相当重要的编辑。。。你应该把这一点放在问题中,为什么不直接键入
Arrays。sort(array)
为什么需要排序如果唯一的数量对你来说很重要假设索引对你的问题也起作用,那么最后一个for循环可以按照频率和索引进行编辑,因此需要再进行一次排序。为此,我建议从每个值中获得索引最低的元素,在频率和索引之后对元素进行排序,作为一个平局断路器(否则正确的顺序将中断)
if(count(arr, arr[i]) >= count(arr, arr[j]) && arr[i] < arr[j]) {           
       temp = arr[i];
       arr[i] = arr[j];
       arr[j] = temp;
}