本人还是处于初级程序员,写的不好的地方还请赐教
昨天经理说让做个对一个文本框输入的文件路径先按照后缀名进行排序,在按照文件路径和文件名进行排序还要去掉重复的数据。
如:a/b/c/aa.jsp
a/b/bb/cc.java等
刚拿到这个任务还一头雾水,不知道怎么下手,结果到最后用了3种方式做了出来,想想真是洗具啊,做的时候,纠结的过程就不多说了,讲讲怎么做的这个东西的思路和方法吧。
数据结构:
因为要去重,所以要用到SET。
排序用到了java的帮助类。Collections或Arrays
还用到了List。因为sort方法要使用数组。
1:这个是第一个想出来的解决方法,感觉这个方式纯粹是为解决问题而解决问题,但也是劳动成果。
这个我用的是HashMap。K放截取的后缀,V是一个List:存目录路径。
然后把所有的K取出来,先给K排序,在根据K取出对应的List数组的value值,在对V进行排序
public class SortFiles { public static String sortText(String files,String tag){ String flag="";//files按照flag来截取,因为每个行是一个文件目录。这个传过来的是“\n” String gfiles="";//返回值 HashMap h1 = new HashMap(); Set s1 = null; Set s2 = new HashSet(); List v3 = new ArrayList(); List keylist = new ArrayList(); s2.clear(); v3.clear(); keylist.clear(); //截取字符串 String[] fileArray = files.split(tag); for(int i=0;i<fileArray.length;i++){ String file = fileArray[i].trim(); if(file.length()==0)continue;//如果是这一行是空的,不处理 int num=file.lastIndexOf("."); flag=file.substring(num+1,file.length()); //第一次出现的后缀名就放入新的SET,如果有就取出已有的SET if(!h1.containsKey(flag)){ s1 = new HashSet(); h1.put(flag, s1); s1.add(file); }else{ s1=(HashSet)h1.get(flag); s1.add(file); } } //把Key取出来放到List里面 Iterator it = h1.keySet().iterator(); while(it.hasNext()){ Object o = it.next(); String key = o.toString(); keylist.add(key); } //对key进行排序 Collections.sort(keylist); String ss=""; //根据key值取出value值,在进行排序 for(int i=0;i<keylist.size();i++){ ss=keylist.get(i).toString(); s2 =(HashSet)h1.get(ss); Iterator itr = s2.iterator(); for(;itr.hasNext();){ String value =itr.next().toString(); System.out.println("--------chenwei-----\n"+value); v3.add(value); } Collections.sort(v3); //返回数值 for(int j=0;j<v3.size();j++){ String text = v3.get(j).toString(); gfiles+=text+"\n"; } v3.clear(); } return gfiles; } }
2:这个用到了实现comparetor接口,重写compare方法。囧,应该上来就用这个方法的,但第一次用,感觉麻烦就没用,其实这个才是解决问题的办法。
①:这个jsp页面的代码
String files=DataDeal.clearNull(request.getParameter("gfiles"),"");//取得文本内容
String[] fileArray = files.split("\n");//存入文件路径
Set set = new HashSet();
//先用set进行存储来去掉重复的数据
for(int i=0;i<fileArray.length;i++){
String file=fileArray[i].trim();
if(file.length()==0){
continue;
}else{
set.add(file);
}
}
//把set转换成list
Iterator it = set.iterator();
List list = new ArrayList();
while(it.hasNext()){
list.add(it.next().toString());
}
//把上面的数据转存入自己写的StringList类数组里面
StringList[] stringList=new StringList[list.size()];
for(int j=0;j<list.size();j++){
String ss = list.get(j).toString();
stringList[j] = new StringList(ss);
}
//进行排序
Arrays.sort(stringList,Comparators.getComparator());
//遍历页面文本的值
for(int k=0;k<stringList.length;k++){
gfiles+=stringList[k]+"\n";
}
System.out.println("--------------------------gfiles---"+gfiles);
}
②:StringList类
package com;
public class StringList{
String fileName="";//文件路径全名:如a/b/c/d.jsp
String name="";//后缀点前面的路径 如a/b/c/d
String flag="";//后缀名 如jsp
public StringList(String file){
int num=file.lastIndexOf(".");
this.fileName=file;
this.name=file.substring(0,num-1);
this.flag=file.substring(num+1,file.length());
}
public String getName() {
return name;
}
public String getFlag() {
return flag;
}
public String toString() {
return fileName;
}
}
③:自己实现的comparetor
package com;
import java.util.*;
import com.sun.org.apache.bcel.internal.generic.NEW;
public class Comparators {
public static Comparator getComparator() {
return new Comparator() {
public int compare(Object o1, Object o2) {
if (o1 instanceof String) {
return compare((String) o1, (String) o2);
} else if (o1 instanceof Integer) {
return compare((Integer) o1, (Integer) o2);
} else if (o1 instanceof StringList) {
return compare((StringList) o1, (StringList) o2);
} else {
System.err.println("未找到合适的比较器");
return 1;
}
}
public int compare(String o1, String o2) {
String s1 = (String) o1;
String s2 = (String) o2;
int len1 = s1.length();
int len2 = s2.length();
int n = Math.min(len1, len2);
char v1[] = s1.toCharArray();
char v2[] = s2.toCharArray();
int pos = 0;
while (n-- != 0) {
char c1 = v1[pos];
char c2 = v2[pos];
if (c1 != c2) {
return c1 - c2;
}
pos++;
}
return len1 - len2;
}
public int compare(StringList o1, StringList o2) {
String name1 = o1.getName();
String name2 = o2.getName();
String flag1 = o1.getFlag();
String flag2 = o2.getFlag();
return (compare(flag1, flag2) == 0 ? compare(name1, name2)
: compare(flag1, flag2));
}
};
}
}
3:直接用内部类写的,其实和第二种差不多
package com;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.Vector;
public class SortFiles {
public static int totalNum=0;
public static String gfiles="";
public static String sortText(String files,String tag){
Set set = new TreeSet();
Collections.addAll(set, files.split(tag));
List list = new ArrayList();
Iterator it = set.iterator();
while(it.hasNext()){
list.add(it.next());
}
Collections.sort(list, new Comparator(){
public int compare(Object arg0, Object arg1) {
String a = arg0.toString().substring(arg0.toString().lastIndexOf(".")+1);
String b = arg1.toString().substring(arg1.toString().lastIndexOf(".")+1);
if(a.compareToIgnoreCase(b) == 0){
return arg0.toString().compareToIgnoreCase(arg1.toString());
}else{
return a.compareToIgnoreCase(b);
}
}
});
for(int i=0;i<list.size();i++){
gfiles = gfiles + list.get(i)+tag;
}
return gfiles;
}
}