工作快两年了,慢慢觉得算法是真重要,不是为了面试刷算法重要,而是在刷题的过程中慢慢形成的这种思维,遇到问题首先思考有几种解决方案,这些解决方案分别都有什么优缺点,算法代价是多少,时间代价和空间代价是否都能接受,我不是计算机科班出身,所以一开始没有接受到正确的教育,没有形成编程思维三观,以前是觉得能解决问题就ok了,但是这样其实是不对的。
——碎碎念
背景:
需要显示手机里的应用、当前占用的内存和最近一次使用的时间这样的三个信息到界面上,要按照占用的内存从大到小排序,如果占用的内存一样,就按照内存的大小排;或者按照最近一次使用的时间排序,如果最近使用的时间一样,就按照内存的大小排。
由于应用的包名和对应的其他信息不是一一映射关系,所以不能用普通的key value型数据结构保存和排序。考虑到数据的可扩展性和存储显示,使用结构体实现。
java的代码实现如下。
package sort;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class SortByTimeOrSize {
//结构体的定义
public static class stu implements Comparable{
long lastUsedTime;//与现在的时间差,时间差越大,代表很久没有用,往前排
long appTotalSize;
String packageName;
stu(){}//无参构造
stu(long time,long size,String name){
this.lastUsedTime = time;
this.appTotalSize = size;
this.packageName = name;
}
@Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
return 0;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stu
//结构体排序 按照最近使用的时间排序(这里的时间代表当前时间-上次使用的时间,是时间差,所以值越大,表示上次使用的时间越早)
Comparator<stu> cmpByTime =new Comparator<stu>(){
public int compare(stu a,stu b) {
if(a.lastUsedTime != b.lastUsedTime)
return (int) (b.lastUsedTime-a.lastUsedTime);//按时间降序
else return (int) (b.appTotalSize-a.appTotalSize);//如果时间相等,按空间大小升序
}
};
//结构体排序 按照空间占用内存大小排序
Comparator<stu> cmpBySize =new Comparator<stu>(){
public int compare(stu a,stu b) {
if(a.appTotalSize != b.appTotalSize)
return (int) (b.appTotalSize-a.appTotalSize);//按占用空间大小降序
else return (int) (b.lastUsedTime-a.lastUsedTime);//如果空间相等,按时间升序
}
};
stu[] no = new stu[10];
no[0] = new stu(9996,8505,"com.wenshy.zero");
no[1] = new stu(9996,3264,"com.wenshy.one");
no[2] = new stu(9996,8506,"com.wenshy.two");
no[3] = new stu(9996,4565,"com.wenshy.three");
no[4] = new stu(9996,8777,"com.wenshy.four");
no[5] = new stu(1584,9694,"com.wenshy.five");
no[6] = new stu(9997,9696,"com.wenshy.six");
no[7] = new stu(1584,9697,"com.wenshy.seven");
no[8] = new stu(9998,9699,"com.wenshy.eight");
no[9] = new stu(1584,9699,"com.wenshy.nine");
//按空间排:8 9 7 6 5 4 2 0 3 1
//按时间排:8 6 4 2 0 3 1 9 7 5
Arrays.sort(no,cmpBySize);//调用对应方法 进行排序
for(int i = 0;i < no.length;i++){
System.out.println(" time:"+no[i].lastUsedTime+" size:"+no[i].appTotalSize+" name:"+no[i].packageName);
}
return;
}
}
目前的实现方案就是这样,有没有更好的还在思考。