Java的List怎么排序啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java的List怎么排序啊?相关的知识,希望对你有一定的参考价值。

import java.util.ArrayList;
import java.util.List;

public class Test
public static void main(String arg[])
List<Number> a = new ArrayList<Number>();
a.add(1);
a.add(6);
a.add(3.0);
a.add(8);
a.add(3.2);
a.add(4);
a.add(6.9);
quickSort(a,0,a.size()-1);
for(Object o : a)
System.out.println(o);



private static void quickSort(List<Number> arr,int left,int right)
int l =left;
int r =right;
double pivot = arr.get((left+right)/2).doubleValue();
double temp =0.0;
while (l<r)
while(arr.get(l).doubleValue()<pivot)
l++;
while(arr.get(r).doubleValue()>pivot)
r--;
if(l>=r)
break;
temp =arr.get(l).doubleValue();
arr.set(l,arr.get(r));
arr.set(r,temp);
if(arr.get(l).doubleValue()==pivot)
--r;
if(arr.get(r).doubleValue()==pivot)
++l;

if(l==r)
l++;
r--;

if(left<r)
quickSort(arr,left,r);
if(right>l)
quickSort(arr,l,right);



写的程序如上,但结果出来本来不带小数点的也变成x.0了,运行结果如下:
1
3.0
3.2
4
6.0
6.9
8.0

怎么解决啊

用Collections.sort就可以排序,
里面的排序是默认的按自然顺序排列
也就是1,2,3,4这种
参数要求实现了Comparable的数据才能排序,
如果你自己写的类,你就要实现Comparable接口,然后在接口里面自动生成的方法里面
指定排序方法,一般的String Inteneger类都是实现了这个接口的 不用自己操作的。
你可以取看源代码
参考技术A

java的集合排序可以这样做:

(1)新建排序规则

package com.test;

import java.util.Comparator;

/**
 * @作者 王建明
 * @创建日期 13-10-18
 * @创建时间 下午9:40
 * @版本号 V 1.0
 */
public class ComparatorNumber implements Comparator 
@Override
public int compare(Object o1, Object o2) 
Number num1 = (Number) o1;
Number num2 = (Number) o2;
if (num1.equals(num2))
return 0;
else if (num1.doubleValue() > num2.doubleValue())
return 1;
else
return -1;

(2)利用排序规则进行排序

package com.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @作者 王建明
 * @创建日期 13-10-18
 * @创建时间 下午9:37
 * @版本号 V 1.0
 */
public class SortTest 
public static void main(String[] args) 
List<Number> a = new ArrayList<Number>();
a.add(1);
a.add(6);
a.add(3.0);
a.add(8);
a.add(3.2);
a.add(4);
a.add(6.9);
ComparatorNumber comparatorNumber = new ComparatorNumber();
Collections.sort(a, comparatorNumber);
for (Object o : a) 
System.out.println(o);


结果如下:

1
3.0
3.2
4
6
6.9
8

追问

3q 出来了,好高端的算法啊,Comparator这是一个接口吗?
Number num1 = (Number) o1;
Number num2 = (Number) o2;
这两句o1传过来的是一个列表,02是一个类的实例,怎么能比较是否相等呢
感觉没有地方调用compare()函数,返回值是给哪个啊,1,0,-1分别起什么作用啊
好复杂……

追答

这是java内置的比较接口,在使用Collections.sort(a, comparatorNumber);的时候java会自动调用所写的比较方法进行数据的比较排序的,此方法不仅用于数字的排序,也可用于字符串的排序,字符串排序时比较可用str1.compareTo(str2)的方式得到比较结果。
1,0,-1其实是比较结果的一个标识【也可用大于0或小于0的其他数值返回】,0表示比较结果是两个内容是一样的,大于0的结果则表示前者大于后者,而小于0的数字则表示后者大于前者

参考技术B

问题在于

double temp =0.0;

你把temp设置成double型,然后

temp =arr.get(l).doubleValue();

所以你把取得的int类型转换成了double类型,最后输出就带上了.0


你仔细看看你的程序,int类型有的排序后没有变,有的变x.0了,凡是加上.0的都是它在排序过程中与double类型的数字进行过交换。

追问

你说的我试过,但是你把temp定义成int后,在交换就会失值,比如里面的3.2赋给temp时它就变成了3了

追答

你把

double temp =0.0;

换成下面这个,用Number类型做过度元素就可以了

Number temp = null;

最后再把

temp =arr.get(l).doubleValue();

改成

temp = arr.get(l);

 最后输出结果就满足要求了!

本回答被提问者采纳
参考技术C 先转成数组,在调用Arrays.sort();追问

怎么转啊,麻烦贴上代码啊,
还有数组没有sort这个方法啊,比如数组是int a[] = 4,1,7,9,3,6,3,是a.sort()这样调用吗

追答

public static void main(String[] args)
List list = new ArrayList();
list.add(3);
list.add(1);
list.add(2);
Integer[] arrays = new Integer[list.size()];
list.toArray(arrays);
Arrays.sort(arrays);
for(int i:arrays)
System.out.println(i);


结果输出1,2,3

追问

你这肯定是这样出啊,我的是List里面有小数又有整数,如果只有整数或者只有小数那是好办

追答

package com.syb;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class Test

/**
* @param args
*/
public static void main(String[] args)
List list = new ArrayList();
list.add(3.3);
list.add(1.2);
list.add(2);
Object[] arrays = new Object[list.size()];
list.toArray(arrays);
Arrays.sort(arrays, new Comparator()

@Override
public int compare(Object o1, Object o2)
return o1.toString().compareTo(o2.toString());

);
for(Object i:arrays)
System.out.println(i);



在java中,怎么从一个数组中删除一个数啊

比如定义一个数组x[]=1,3,5,2,8,7,6,9
怎么把当中的5删除啊

如果用的是原生数组,删除和增加就很不方便,毕竟数组长度已经是定死了,所以你只能去新建一个新的数组来对操作的结果进行保存,但是如果其他地方又用到了这个数组,那对于被引用的旧的数组其实却是没有改变的

所以你应该使用一些类似ArrayList之类的类,对数据类型进行保存

List<Integer> arr = new ArrayList<Integer>();
arr.add(1);
arr.add(2);
arr.add(3);
// 添加你想要的数据
arr.remove(1); //注意这里是移除你所想移除的下标
// 当然,remove接受的参数也可以直接是一个内容
arr.remove(Integer.valueOf(1));
参考技术A 你可以这样试试 比如是int类型的数组,
int[] i=new int[]12312312,31231,312312

然后我要删除第二个元素的东西

i[1]=0;

我去循环便利这个数组

for(int j=0;j<i.Length;j++)
if(i[j]!=0)
//做你的需要做的操作



要是String类型的话
删除的时候就是直接修改成null,然后去判断.equals("")就行拉
其余像char什么的也差不了多少
这样的话不是真删除,但是也能达到效果
参考技术B Array没有提供这,集合类中, Collection<E>接口中set,list。。。这几个有这方法,在项目中常用也是此,比如remove(int index)就可以实现你这那,具体方法看API文档里非常详细 参考技术C java中数组长度是不可变的
要不就用ArrayList类
参考技术D http://hi.baidu.com/blucastle/blog/item/d394e53f2b0b0e3570cf6ceb.html本回答被提问者采纳

以上是关于Java的List怎么排序啊?的主要内容,如果未能解决你的问题,请参考以下文章

java 怎么将List里面数据排序

java 怎么对日期列进行排序

C#中排序问题,将一个list中对象的某个值排序,返回值最大的那个对象,程序没有结果,哪位高人帮忙看看啊

java怎么对list进行排序

如何实现Java中hashmap的value值是对象的时候的排序

java排序问题,comparator接口,求高手