一道集合排序题

集合排序

现有若干个集合的数据,每个数据集合可以自选一个指标参加排序。这些指标包含如下四种:

Min ,取集合中元素的最小值

Max ,取集合中元素的最大值

Mean ,取集合中元素的平均值,平均值的计算公式为: (V1+V2+…+Vn) / n

Median ,取集合中元素的中值,中值的计算公式为: (Vmin+Vmax) / 2

读入数据后,请根据各个集合选择的指标对这些集合进行降序排列,每个集合内的元素请升序排列。

 

输入:

    每行一个集合。[ ] 内为该集合选取的用于集合间排序的指标。随后为集合内各个元素,元素个数不定,以空格分隔。

    若输入行的第一个字符为“*”,则表示输入数据结束。

 

输出:

    每行输出一个集合。{ }内为计算出该集合的排序指标值,随后为该集合的各个元素的升序排列。

 

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

//20191009
public class 集合排序{
    public static void main(String[] args) {
        //保存指标值和数据集合的内部类
        class T implements Comparable<T> {
            //这个接口规定排序的时候是怎么比较的
            String f;//指标类型
            int real;//指标值(计算)
            int[] d;//数据集合

            /**/
            @Override
            public int compareTo(T o) {
                if (real < o.real)
                    return 1;
                else if (real > o.real)
                    return -1;

                return  0  ;
            }
        }
        List<T> cols = new ArrayList<T>();
        String str = null;
        do {
            //接受键盘输入的对象
            Scanner scanner = new Scanner(System.in);
            str = scanner.nextLine();//接受键盘输入
            if ("*".equals(str)) {/*如果键盘输入的是*就跳出*/
                break;
            }
            String[] ss = str.split("]");//"]"将整个字符串从“]”处分为字符串数组,返回后的数组不包括“]”本身
            // 将字符串打散后,分为两部分,第一部分是指标值,第二部分是要处理的数据
            String z = ss[0].substring(1);//得到指标值
            /*str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str;
str=str.substring(int beginIndex,int endIndex);截取str中从beginIndex开始至endIndex结束时的字符串,并将其赋值给str;*/
            //substring() 方法用于提取字符串中介于两个指定下标之间的字符。比如提取max
            String dataString = ss[1];//实际数据集合
            String[] data = dataString.split(" ");//将数据数据集合一个一个分开
            int[] indata = new int[data.length];
            //创建一个整数数组,要将一个字符串数组变成整数数组
            //遍历字符串数组,将它们变成整数数组。
            for (int i = 0; i < data.length; i++) {
                indata[i] = Integer.parseInt(data[i]);
            }

            //创建T对象
            T t = new T();
            t.f = z;//指标类型
            t.d = indata;//整数数组
            //处理指标值
            switch (t.f) {
                case "Max":
                    int m = t.d[0];//拿出一个初值
                    for (int i = 0; i < t.d.length; i++) {
                        if (t.d[i] > m) {
                            m = t.d[i];
                        }
                    }
                    t.real = m; //指标值就是real
                    break;

                case "Min":
                    int sm = t.d[0];
                    for (int i = 0; i < t.d.length; i++) {
                        if (t.d[i] < sm) {
                            sm = t.d[i];
                        }
                    }
                    t.real = sm;
                    break;

                    /*处理平均值*/
                case "Mean":
                    int totle = 0;
                    for (int i = 0; i < t.d.length; i++) {
                        totle += t.d[i];//将整个数组全部相加
                    }
                    t.real = totle / t.d.length;
                    break;

                    /*处理中值*/
                case "Median":
                    int m2 = t.d[0];
                    int m3 = t.d[0];
                    for (int i = 0; i < t.d.length; i++) {
                        if (t.d[i] < m2) {
                            m2 = t.d[i];//m2存最小值
                        }
                        if (t.d[i] > m3) {
                            m3 = t.d[i];//m3存最大值
                        }
                    }
                    t.real = (m2 + m3) / 2;
                    break;
             }

             //冒泡排序:升序排序
             for (int i = t.d.length - 1; i >= 0; i--) {    //整个的次数
                for (int j = 0; j < i; j++) {       //每一次要交换多少下
                    if (t.d[j] > t.d[j+1]) {
                        int temp = t.d[j];
                        t.d[j] = t.d[j + 1];
                        t.d[j + 1] = temp;
                    }
                }
            }

            cols.add(t);//将遍历的对象放在集合里

        } while (true);

           Collections.sort(cols);//重写了campareto()方法

           for(T t:cols){/*foreach循环*/
              System.out.print("{"+t.real+"}");
               for(int i=0;i<t.d.length;i++){
                   System.out.print(t.d[i]+" ");
                  }
                 System.out.println();
              }



          }

    }
发布了64 篇原创文章 · 获赞 47 · 访问量 9530

猜你喜欢

转载自blog.csdn.net/weixin_42194284/article/details/102788549
今日推荐