集合排序
现有若干个集合的数据,每个数据集合可以自选一个指标参加排序。这些指标包含如下四种:
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();
}
}
}