zoukankan      html  css  js  c++  java
  • 个人实现---多级排序

    写过SQL的都知道,有个Order By排序功能,这个Order By不仅能根据一个元素进行排序,还能同时根据多个元素进行排序。

    你有没有好奇是怎么实现多个元素排序的呢?小编是很好奇。单个元素排序很简单,直接冒泡就行了,那么多个怎么实现呢?难道要写多个冒泡么?

    带着疑问,开始了构思。最终大道至简,可以把多个元素拼接成一个大的元素进行比对,这样用一个冒泡就完成了多个元素排序。是不是豁然开朗。

    其实很多问题都是可以分分合合的,最终就是为了计算。比如搞分布式就是为了分,方便每个节点进行计算。使用shuffling进行拉取,方便进行统一计算。

    好了,扯得有点多了,下面上代码(这个是Java版的,道理是一样的,你可以翻译成其它语言):

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;
    
    public class Test {
    
        public static void main(String[] args) {
    
            // 构建数据
            List<List<Integer>> list = new ArrayList<List<Integer>>();
            list.add(Arrays.asList(1, 3, 4, 5));
            list.add(Arrays.asList(1, 2, 4, 6));
            list.add(Arrays.asList(4, 1, 7, 8));
            list.add(Arrays.asList(3, 5, 7, 9));
            list.add(Arrays.asList(2, 5, 7, 9));
            list.add(Arrays.asList(4, 1, 6, 8));
    
            // 设置通过前两个数据进行排序,索引设置索引1
            SortMultiple(list, 1);
    
            for (List<Integer> l : list) {
                System.out.println(l);
            }
            //排序结果如下:
            // [1, 2, 4, 6]
            // [1, 3, 4, 5]
            // [2, 5, 7, 9]
            // [3, 5, 7, 9]
            // [4, 1, 7, 8]
            // [4, 1, 6, 8]
        }
    
        /**
         * 多级排序-通过冒泡实现
         * Demo数据:"1,3,4,5","1,2,4,6","4,1,7,8","3,5,7,9","2,5,7,9","4,1,6,8" 思路:
         * 上面的数据可以排列成一个矩阵。 "1,3,4,5" "1,2,4,6" "4,1,7,8" "3,5,7,9" "2,5,7,9" "4,1,6,8"
         * 将对比的每个元素根据具体的位,拼接成一个数据。然后根据数据进行对比。 对比交换时,对两个List整体进行交换。
         * 比如根据前两位进行对比12小于13,那么交换时交换"1,3,4,5"和"1,2,4,6"
         * 
         * @param list设置要对比的元素。
         * @param index是索引,设置通过前几个元素排序。比如前2个元素,那么index就设置1,前一个元素,那index就设置0.
         */
        public static void SortMultiple(List<List<Integer>> list, int index) {
    
            for (int i = 0; i < list.size(); i++) {
    
                for (int j = i + 1; j < list.size(); j++) {
                    double bNumSum = 0;// 前一个数据
                    for (int bNum = index; bNum >= 0; bNum--) {
                        bNumSum += list.get(i).get(index - bNum).doubleValue() * Math.pow(10, bNum);
    
                    }
    
                    double eNumSum = 0;// 后一个数据
                    for (int eNum = index; eNum >= 0; eNum--) {
                        eNumSum += list.get(j).get(index - eNum).doubleValue() * Math.pow(10, eNum);
                    }
    
                    if (eNumSum < bNumSum) {// 此处是按照升序排序,如果降序的话改为>即可。
                        List<Integer> chi = list.get(i);
                        List<Integer> chj = list.get(j);
                        list.set(j, chi);
                        list.set(i, chj);
                    }
    
                }
            }
    
        }
    
    }

    其实编程就是思路,有了思路一切都好说。 

  • 相关阅读:
    phpexcel读取excel文件
    laravel的表单验证(下面有些信息未验证,转的)
    Laravel框架学习(Response)
    laravel文件存储Storage
    Laravel 5 教程
    js中substring和substr的用法
    jquery 规范
    总结oninput、onchange与onpropertychange事件的用法和区别
    jquery 选择器的总结
    jquery选择器中的find和空格,children和>的区别、及父节点兄弟节点,还有判断是否存在的写法
  • 原文地址:https://www.cnblogs.com/shuai7boy/p/12772190.html
Copyright © 2011-2022 走看看