结果处理 顶者有分 用作key放进哈希表,再把哈希表的所有key取出来 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 vgvg(天下风云出我辈) 楼主的组合有规律吗?先英文,后中文。先字数少的,后字数多的。依次排列。 用TreeSet很容易就搞定,而且效率高 treeroot(天才--天天被人踩,人才--人人都想踩) 我不喜欢你种人!什么都好容易呀!那你就应该指点一下啊??!! import java.util.*;class TreeSetDemo { public static void main(String[] args) { String[] arr_a={"物质","我","或","也是","你好吗","真理","我"}; String[] arr_b={"但","sentence","syntax","你好吗"}; String[] arr_c={"我","物质","可是","真理"}; Set treeSet=new TreeSet(new Comparator(){ public int compare(Object o1,Object o2){ //必须是String String s1=(String)o1; String s2=(String)o2; //如果第一个字符是字母,就认为是英文 //这里和256比较似乎不是很合理,但是用 Character.isLetter()又不对!对中文也返回true? if(s1.length()==0) return -1; if(s2.length()==0) return 1; char c1=s1.charAt(0); char c2=s2.charAt(0); if(c1<256){ if(c2<256){ //都是英文,按字典排序 return s1.compareTo(s2); } else{ //英文一定在前,返回负数 return -1; } } else{ if(c2<256){ //中文在后,返回正数 return 1; } else{ //都是中文,比较长度 int i=s1.length()-s2.length(); //下面一定要注意,不能直接返回 i,思考一下吧! if(i!=0) return i; return s1.compareTo(s2); } } } }); treeSet.addAll(Arrays.asList(arr_a)); treeSet.addAll(Arrays.asList(arr_b)); treeSet.addAll(Arrays.asList(arr_c)); String[] arr_d=(String[])treeSet.toArray(new String[0]); for(int i=0;i<arr_d.length;i++) System.out.println(arr_d[i]); }} to yulchina(为啥我的可用分总是那么少?) 我不是正在写吗?而且还有调式一下,要不少一个标点别人都会挑剔! 写了一个比较类,用法:首先将楼主的3个结果集全部加入到一个ArrayList中,然后StrComparator comp = new StrComparator();Collections.sort(alist, comp);即可public class StrComparator implements Comparator { public int compare(Object element1, Object element2) { //将字符串转化为字符数组 char[] buffer1 = ((String)element1).toCharArray(); char[] buffer2 = ((String)element2).toCharArray(); //取第一个字符 int c1 = (int) buffer1[0]; String u1 = Integer.toHexString(c1); int c2 = (int) buffer2[0]; String u2 = Integer.toHexString(c2); if (u1.length() <= 2) {//element1是ascii字符 if (u2.length() <= 2) {//element2也是ascii字符 return ((String)element1).compareTo(element2); } else { //element2是中文 return -1; } } else { //element1是中文 if (u2.length() <= 2) {//element2是ascii字符 return 1; } else { //element2也是中文 String str1 = (String) element1; String str2 = (String) element2; int length1 = str1.length(); int length2 = str2.length(); return length1 - length2; } } }} to hxzg001(大家踊跃结贴啊) 你的程序的三点不足:1.没有有效的去掉重复的数据2.Compratator实现的不足,因为如果是两个中文的话,如果长度相同你就认为相同 这显然是不符合逻辑的3.排序的效率不高,对ArrayList的排序的复杂度是o(n*n) to treeroot(天才--天天被人踩,人才--人人都想踩) 多谢提醒,第一点我确实没有注意,不过也好改,只要将3个结果集改为加入到一个HashMap中,然后对这个HashMap进行Collections.sort就可以了;第二点楼主除了长度好像没有别的要求吧,你看结果集D中中文的排列出了长度没有别的阿;第三点没怎么研究,不过如果如第一点所述改为对HashMap进行排序的话效率应有所提高吧,treeroot可以提供一些这方面的资料吗? 晕!HashMap是不可以排序,确实可以过滤重复的数据,不过逻辑上也应该用HashSetTreeSet用的是红黑树算法,其实就是一个二叉树,本身就是有续的做到了既过滤重复数据,同时又排好了续,而且效率又高,可以说是一举三得。当然照你那样也可以实现1.先用HashSet2.转换成List再排序 晕,今天老出错,呵呵写了一个Comparator却不会用了 up treeroot(天才--天天被人踩,人才--人人都想踩) 给个QQ 或者 MSN OK 我的MSN是[email protected] 有志同道合的和可以加我 我觉得可以先分成两个list:英文一个,中文一个然后先按字符串.length输出英文list然后再按字符.length输出中文list 意,我怎么发觉按你的那个排序规律不能输出你的那个结果集!规律:先英文,后中文。先字数少的,后字数多的。依次排列。你的答案:sentence syntax 我 但 或 物质 也是 可是 真理 你好吗真确的应该是:<font color="#ff0000">syntax sentence</font> 我 但 或 物质 也是 可是 真理 你好吗 treeroot(天才--天天被人踩,人才--人人都想踩) 你的方法很好的。不知有没有其他方法? treeroot(天才--天天被人踩,人才--人人都想踩) ( ) 好吧 结帐 请问如何新定义 ArrayList方法?十分感谢! 请教一个随机数比较的问题 怎么打包成jar文件哦? 菜鸟求助 用多线程速度比单线程还慢? Menu中关于监听的问题 ByteArrayInputStream 如何转化成 String JVM OutOfMemoryError 如何解决? 如何制作java帮助文档? rmi的一点小问题。 Class中的一个方法 请问我错在哪,该怎样解决这问题啊?
楼主的组合有规律吗?先英文,后中文。先字数少的,后字数多的。依次排列。
我不喜欢你种人!什么都好容易呀!
那你就应该指点一下啊??!!
class TreeSetDemo
{
public static void main(String[] args)
{
String[] arr_a={"物质","我","或","也是","你好吗","真理","我"};
String[] arr_b={"但","sentence","syntax","你好吗"};
String[] arr_c={"我","物质","可是","真理"};
Set treeSet=new TreeSet(new Comparator(){
public int compare(Object o1,Object o2){
//必须是String
String s1=(String)o1;
String s2=(String)o2;
//如果第一个字符是字母,就认为是英文
//这里和256比较似乎不是很合理,但是用 Character.isLetter()又不对!对中文也返回true?
if(s1.length()==0) return -1;
if(s2.length()==0) return 1; char c1=s1.charAt(0);
char c2=s2.charAt(0);
if(c1<256){
if(c2<256){
//都是英文,按字典排序
return s1.compareTo(s2);
}
else{
//英文一定在前,返回负数
return -1;
}
}
else{
if(c2<256){
//中文在后,返回正数
return 1;
}
else{
//都是中文,比较长度
int i=s1.length()-s2.length();
//下面一定要注意,不能直接返回 i,思考一下吧!
if(i!=0) return i;
return s1.compareTo(s2);
}
}
}
});
treeSet.addAll(Arrays.asList(arr_a));
treeSet.addAll(Arrays.asList(arr_b));
treeSet.addAll(Arrays.asList(arr_c));
String[] arr_d=(String[])treeSet.toArray(new String[0]);
for(int i=0;i<arr_d.length;i++)
System.out.println(arr_d[i]);
}
}
StrComparator comp = new StrComparator();
Collections.sort(alist, comp);
即可public class StrComparator implements Comparator {
public int compare(Object element1, Object element2) {
//将字符串转化为字符数组
char[] buffer1 = ((String)element1).toCharArray();
char[] buffer2 = ((String)element2).toCharArray();
//取第一个字符
int c1 = (int) buffer1[0];
String u1 = Integer.toHexString(c1);
int c2 = (int) buffer2[0];
String u2 = Integer.toHexString(c2);
if (u1.length() <= 2) {//element1是ascii字符
if (u2.length() <= 2) {//element2也是ascii字符
return ((String)element1).compareTo(element2);
}
else { //element2是中文
return -1;
}
}
else { //element1是中文
if (u2.length() <= 2) {//element2是ascii字符
return 1;
}
else { //element2也是中文
String str1 = (String) element1;
String str2 = (String) element2;
int length1 = str1.length();
int length2 = str2.length(); return length1 - length2;
}
}
}
}
你的程序的三点不足:
1.没有有效的去掉重复的数据
2.Compratator实现的不足,因为如果是两个中文的话,如果长度相同你就认为相同
这显然是不符合逻辑的
3.排序的效率不高,对ArrayList的排序的复杂度是o(n*n)
第一点我确实没有注意,不过也好改,只要将3个结果集改为加入到一个HashMap中,然后对这个HashMap进行Collections.sort就可以了;
第二点楼主除了长度好像没有别的要求吧,你看结果集D中中文的排列出了长度没有别的阿;
第三点没怎么研究,不过如果如第一点所述改为对HashMap进行排序的话效率应有所提高吧,treeroot可以提供一些这方面的资料吗?
TreeSet用的是红黑树算法,其实就是一个二叉树,本身就是有续的
做到了既过滤重复数据,同时又排好了续,而且效率又高,可以说是一举三得。当然照你那样也可以实现
1.先用HashSet
2.转换成List再排序
写了一个Comparator却不会用了
treeroot(天才--天天被人踩,人才--人人都想踩) 给个QQ 或者 MSN OK 我的MSN是[email protected] 有志同道合的和可以加我
然后先按字符串.length输出英文list
然后再按字符.length输出中文list
规律:
先英文,后中文。先字数少的,后字数多的。依次排列。
你的答案:
sentence syntax 我 但 或 物质 也是 可是 真理 你好吗
真确的应该是:
<font color="#ff0000">syntax sentence</font> 我 但 或 物质 也是 可是 真理 你好吗
你的方法很好的。不知有没有其他方法?
好吧 结帐