对特定规则文字进行排序
2011-08-31 16:02
666 查看
本人还是处于初级程序员,写的不好的地方还请赐教
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/61c17ed2eb67211a84e137429ac3f7ad.gif)
昨天经理说让做个对一个文本框输入的文件路径先按照后缀名进行排序,在按照文件路径和文件名进行排序还要去掉重复的数据。
如:a/b/c/aa.jsp
a/b/bb/cc.java等
刚拿到这个任务还一头雾水,不知道怎么下手,结果到最后用了3种方式做了出来,想想真是洗具啊
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/899229cfab2c02d614490485cabb781b.gif)
,做的时候,纠结的过程就不多说了,讲讲怎么做的这个东西的思路和方法吧。
数据结构:
因为要去重,所以要用到SET。
排序用到了java的帮助类。Collections或Arrays
还用到了List。因为sort方法要使用数组。
1:这个是第一个想出来的解决方法,感觉这个方式纯粹是为解决问题而解决问题,但也是劳动成果
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/be464c4bc931695e6061dda7f6a00baf.gif)
。
这个我用的是HashMap。K放截取的后缀,V是一个List:存目录路径。
然后把所有的K取出来,先给K排序,在根据K取出对应的List数组的value值,在对V进行排序
2:这个用到了实现comparetor接口,重写compare方法。囧,应该上来就用这个方法的,但第一次用,感觉麻烦就没用,其实这个才是解决问题的办法。
①:这个jsp页面的代码
③:自己实现的comparetor
3:直接用内部类写的,其实和第二种差不多
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/61c17ed2eb67211a84e137429ac3f7ad.gif)
昨天经理说让做个对一个文本框输入的文件路径先按照后缀名进行排序,在按照文件路径和文件名进行排序还要去掉重复的数据。
如:a/b/c/aa.jsp
a/b/bb/cc.java等
刚拿到这个任务还一头雾水,不知道怎么下手,结果到最后用了3种方式做了出来,想想真是洗具啊
![](https://oscdn.geek-share.com/Uploads/Images/Content/201603/899229cfab2c02d614490485cabb781b.gif)
,做的时候,纠结的过程就不多说了,讲讲怎么做的这个东西的思路和方法吧。
数据结构:
因为要去重,所以要用到SET。
排序用到了java的帮助类。Collections或Arrays
还用到了List。因为sort方法要使用数组。
1:这个是第一个想出来的解决方法,感觉这个方式纯粹是为解决问题而解决问题,但也是劳动成果
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/be464c4bc931695e6061dda7f6a00baf.gif)
。
这个我用的是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; } }
相关文章推荐
- Datafarne按照某一列的特定规则进行排序【Python】
- 查询特定的某些数据,并且按照某个字段进行排序
- 把字符串按照特定的字母顺序进行排序的js代码
- decode对字符列进行特定的排序
- 【java】实体类中 按照特定的字段 进行升序/降序 排序
- C++利用自带的sort函数重写比较规则后对结构体进行排序-王道机试
- OC从父串中查找子串,并得到子串的位置信息,对这些子串进行一些特殊操作的问题,如特定文字显示高亮颜色
- 对如下数组排序 {12,1,23,24,235,237,231,571,575,57} 排序规则如下:先找第一位,比较大的,如果相同,接着按第二位找,找第二位比较大的,依次类推,进行排序
- java Arrays.sort(T[] a, Comparator<? super T> c)调用一个已经封装好的排序规则进行排序
- C++对类或结构体进行指定规则排序
- 已知一数组,按第一个数最大第二个数最小,依次下去进行的规则排序
- 1.给出一个Person类里面包含姓名、年龄、成绩,声明5个Person对象数组,要求对数组中的内容进行排序,排序规则如下:按成绩由高到低排序,如果成绩一样,按年龄由高到低排序。
- vector stable_sort结合排序规则将牌按照大小和长短进行排序, 为了三带二的牌型等
- 把字符串按照特定的字母顺序进行排序的js代码
- 2016网易实习生招聘笔试题:已知一般App版本为1.0.0/1.0.1/1.2.3,其符合a.b.c的规则。将排序不规则,约为100w个版本号进行从小到大排序
- 第五章:自定义评分规则进行排序
- 按规则对对象数组进行排序
- 规则文本数据文件根据关键字段进行排序的实现
- SQL按指定文字顺序进行排序(中文或数字等)
- Java 特定规则排序-LeetCode 179 Largest Number