java 怎么将List里面数据排序

Posted

tags:

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

参考技术A

不好意思,上午只是粗略地看了一下,没有细致看,现在详细回答你的提问。


ArrayList底层是用一个长度为10的Object数组实现,不管添加进去什么类型的数据,都会转换成Object对象,除非你用很早以前的JDK版本。这样就好理解了,像你写的程序arrayList1中add了String和Integer两种类型的数据,这两类对象没有什么可比性,就像拿打火机和U盘比一个性质。所以,是没有办法进行直接排序的。


你要求的是要按ArrayList里面的第1、2、4数据进行排序,这个可以。


先来arrayList1

四个数据分别是2、"daas"、6、"1",第1、2、4数据即2、“daas”、“1”,我选择按照String类型进行排序,所以第1个数据2转换成String类型即可。因为第3个数据6不进行排序,remove就好。这是个题还是个什么,其实还是留了点活路的,因为后面的(你arrayList2\\3\\4下面)代码都是往arrayList1中添加的,而且还都是String类型。这也是我选择String类型进行排序的原因。代码如下:

  List arrayList1 = new ArrayList();

        arrayList1.add(2); //0

        arrayList1.add("daas"); //1

        arrayList1.add(6); //2

        arrayList1.add("1"); //3

        list.add(arrayList1);

        

        //my code

        String convert = String.valueOf(arrayList1.get(0));

        arrayList1.remove(2);

        arrayList1.remove(0);

        arrayList1.add(convert);

      

         /此处为你的arrayList2\\3\\4代码  

      

        Collections.sort(arrayList1);

        for(int i = 0; i < arrayList1.size(); i++)

        System.out.println(arrayList1.get(i));

       

结果为:

1

2

3

5

8

daas


因为怕你深挖,强调两点:

第一点,由结果看出Collections.sort(arrayList1),是以String的ASCII码进行排序的,为了证明这一点,就要看原代码,这时你就会发现JDK中String的compareTo方法是个空实现,底层并不是用java写的,这点没事,我们可以用一定的方法让它把特征暴露出来,然后就可以理解思想。你看我下面写的小测试程序就会明白。

String a = new String("Z");

String b = new String("A");

System.out.println(a.compareTo(b));

String c = new String("A");

String d = new String("B");

System.out.println(c.compareTo(d));

//看结果,证明String的自然顺序比较即比较ASCII值,只是第一步。

//看结果,证明compareTo返回值是后面的ASCII码减支前面的ASCII码,第二步。

String e = new String("g");

String f = new String("e");

String h = new String("h");

List<String> list = new ArrayList<String>();

list.add(e);

list.add(f);

list.add(h);

Collections.sort(list);

for(String i : list)

System.out.println(i);

结果为:

25

-1

e

g

h

//证明String的自然排序即ASCII码从小到大排序,最后一步。


第二点,你的要求是“要按ArrayList里面的第1、2.4数据进行排序,分别怎么做啊”,这个问题的描述有问题,或者不详细,arryList2、arrayList3、arrayList4任何一个里面一共就add了3个数据,哪来第4个。如果是分别对arrayList2\\3\\4里面的数据进行排序,两个选择,(1)把所有Integer转换成String类型,再排序,参考arrayList2。(2)运用Integer.valueOf()方法,将内容为数字的String数据转换成Integer,把原来的remove掉,把内容非数字的String数据remove掉,再排序,桶排序、冒泡排序、快速排序等你随便选。


讲解到这,不管想对哪个list进行排序,你应该都会写了。


总结:

    除非比较ASCII码,Integer类型和内容为非数字的String类型数据是没有办法进行比较的,不管是直接比较,还是间接比较。还是上面那句话,像打火机和U盘没有可比性一样,理解这点很重要。

    即使用Integer.valueOf()方法对内容为非数字的String类型数据进行转换没有用,会报NumberFormatException。说这点意思是如果你想按Integer类型排序,得把所有内容为非数字的String类型数据remove掉。


题外话:这种类型的题我记得上大学的时候有,不知道你是不是学生,今天想来,其实用处真不大,都用泛型,现在写代码不用泛型的程序员几乎是完全不存在了。


祝心情愉快~~


亲手打,如果满意,把分给我吧~~哈哈。。

java中list里面存放map,根据map中的某两个个字段进行排序

package com.compare.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main 
    public static void main(String[] args) 
        Main mainTest=new Main();
        mainTest.sortMap();
    
    
    public  void sortMap()
        List<Map<Integer, Double>> maps=new ArrayList<Map<Integer, Double>>();
        for(int i=0;i<10;i++)
            HashMap<Integer, Double> map=new HashMap<Integer, Double>();
            for(int j=0;j<2;j++)
                map.put(j, Math.random());
            
            maps.add(map);
        
        
        for(Map<Integer, Double>  map:maps)
            System.out.println(getValue(map));
        
        System.out.println("************************");
        Map<Integer, Double> currentMap;
        for(int i=0;i<maps.size()-1;i++)
            for(int j=0;j<maps.size()-i-1;j++)
                if(getValue(maps.get(j))>getValue(maps.get(j+1)))
                    currentMap=maps.get(j+1);
                    maps.set(j+1, maps.get(j));
                    maps.set(j,currentMap);
                
            
        
        
        for(Map<Integer, Double>  map:maps)
            System.out.println(getValue(map));
        
        
        
        
    
    
    public Double getValue(Map<Integer, Double> currentMap)
        return currentMap.get(0)+currentMap.get(1);
    
    
    
    
    

我采用最简单的排序大数沉底。而且getValue
方法你可以自己实现,决定使用哪几个进行排序。(我们有进行key值不存在的判断)

参考技术A list是存放单独的元素的,而map集合存放的是键值和对应的映射关系 你是不能单纯的把map存入list中的,你是想把map的键存入list吗?还是存放值,异或着是存放他的映射关系? 参考技术B 用Collections.sort(List list, Comparator c)

实现一个Comparator即可
public class MyComparator implements Comparator

public int compare(Object o1, Object o2)
Map m1=(Map)o1, m2=(Map)o2;
//从m1与m2取字段值然后比较,大于返回1,等于返回0,小于返回-1

public boolean equals(Object o)
//同上面类似
追问

恩 这是JAVA的 实现 vb.net 也可以这样吗

追答

实现System.Collections.IComparer

Public Class MyComparer
Implements System.Collections.IComparer
Public Function Compare(ByVal x As Object, ByVal y As Object) _
As Integer Implements IComparer.Compare
list.sort(new MyComparer)

本回答被提问者和网友采纳
参考技术C 最简单的就用两个for循环,
用打擂算法排序(或者选择排序都可以)追问

具体来说呢

参考技术D 实现Comparator接口就好了,想怎么排就怎么排。追问

vb.net 也可以这样吗

以上是关于java 怎么将List里面数据排序的主要内容,如果未能解决你的问题,请参考以下文章

java中list排序

Java里面List排序

java list 批量操作?

怎么将list集合中的数据加载到Map中

java 怎么把list里面的数据取出来依次比较

java 对比两个list并取值