问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

JAVA中list排序问题

发布网友 发布时间:2022-04-25 18:00

我来回答

5个回答

热心网友 时间:2022-05-01 13:40

分不多,不过正好我研究了这里,也算给自己做个总结:

我为了方便解释、写了一个测试类

/** test for reflex */
public class Model {
private String name;
private String content;

public Model(){
this.name = "my name";
this.content = "a long text";
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public String getContent() {
return content;
}
//测试
public void test() throws Exception{
Model model = new Model();
Method m1 = model.getClass().getMethod("getName", null);
System.out.println(m1.invoke(model, null));
}
public static void main(String args[]){
try {
new Model().test("getName");
} catch (Exception e) {
e.printStackTrace();
}
}
}
首先调用test,传递一个method过去;

通过反射机制(这里用到了getMethod、invoke,我比较喜欢getField)、获取到m1对象的getName方法,getMethod第一个参数为方法名、第二个是给这个method的参数的类型,
If parameterTypes is null, it is treated as if it were an empty array,如果为null,表示没有参数;(即 getName()方法);

然后在通过 invoke 注入参数;第一个是相应对象的引用、第二个是参数值(刚刚的是类型,现在才是值);
If the underlying method is static, then the specified obj argument is ignored. It may be null,也就是说static的方法第一个参数是null;
我们要调用的是getName(),那么就是 m1.invoke(model,null)了;

执行结果为:my name ;相当于调用了getName()方法.
绕了一圈也就是 model.getName() == model.getClass().getMethod("getName",null).invoke(model,null);

对于有参数的,调整为
public void test(String method) throws Exception{
Model model = new Model();
Method m1 = model.getClass().getMethod(method, String.class);
m1.invoke(model, "can you");
System.out.println(model.getName());
}
结果:can you

接下来上边的题目就简单了,
public void Sort(List<E> list, final String method, final String sort){
这里给出了method,接下来是一个内部类的处理;自定义一个comparator,

Method m1 = ((E) a).getClass().getMethod(method, null);
这里就是获取method方法,他没有参数。

m1.invoke(((E)a), null).toString()
这里是得到对象a调用方法method之后的返回值。

ret = m1.invoke(((E)a), null).toString().compareTo(m2.invoke(((E)b), null).toString());
而这里就是比较两个对象method方法的返回值

将ret交给sort进行排序;

就像3楼说的、真正排序的是sort方法,下面的只是对一个类中某个方法的返回值进行比较

热心网友 时间:2022-05-01 14:58

compareTo 只是比较2个字符串,不能进行排序
String s1 = "abc";
String s2 = "abcd";
String s3 = "abcdfg";
String s4 = "1bcdfg";
String s5 = "cdfg";
String s6="abc";
System.out.println( s1.compareTo(s2) ); // -1 (前面相等,s1长度小1)
System.out.println( s1.compareTo(s3) ); // -3 (前面相等,s1长度小3)
System.out.println( s1.compareTo(s4) ); // 48 ("a"的ASCII码是97,"1"的的ASCII码是49,所以返回48)
System.out.println( s1.compareTo(s5) ); //-2
System.out.println( s1.compareTo(s6) ); // 0
比较方法其实就是对字符串中的字符逐个比较ASCII 值相减,如果2个字符串是包含关系返回长度差。Collections.sort方法才是对LIST 进行排序的方法。

热心网友 时间:2022-05-01 16:33

这是根据Collections.sort重载方法来实现 list比较排序
compare 方法返回int类型参数实现正序和倒序排列
那我们来分析一下这句
ret = m1.invoke(((E)a), null).toString().compareTo(m2.invoke(((E)b), null).toString());
method m1 invoke方法中 将Object a强制转换为实体E类型 类型数组null 之后to成String 返回类型,与m2的invoke方法返回类型进行字符比较。 其结果返回的int类型 是compare 方法的返回类型。
Collections.sort将Sort方法中的参数list 进行排序,
ret = m2.invoke(((E)b), null).toString().compareTo(m1.invoke(((E)a), null).toString());
ret = m1.invoke(((E)a), null).toString().compareTo(m2.invoke(((E)b), null).toString());
这两句返回参数理论上是相反的

不用为此纠结 这只是个实例 有不明白的 可以Hi我 ms_compound

热心网友 时间:2022-05-01 18:24

m1.invoke通过反射,调用方法
compareTo.按字典顺序比较两个字符串

热心网友 时间:2022-05-01 20:32

看来我还是要好好看书啊
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? vb里空控件list在遍历的时候有直接遍历和倒序遍历,如For i = List1.ListCount - 1 To 0 Step -1 链表的倒序和排序 创建list数组时如何倒序 去美国留学,哪家中介好 美国留学中介性价比排名前十名都有哪些? 美国留学中介机构有哪些 美国留学 不想在老家找留学机构怎么办? 合肥高升学校出国留学部怎么样 马鞍山有美国留学中介吗 去美国留学应该选哪个机构比较好? 谁知道合肥津桥留学怎么样? 想去美国都大学,想问下大家,现在找中介的话,一般费用要多少? 想去美国留学,本人在合肥读高二了,求推荐的靠谱的留学中介? 轿车电驱版和油电混动版有什么区别? 5万以下油电混合小汽车有哪些? 混合动力的轿车有什么缺点,为什么有些人认为买混动车的人很少? 轿车有几种车是混合动力的? 什么是混合动力轿车? 你知道混合动力的轿车有什么缺点吗?为什么有些人以为买混动车的人很少呢? 混合动力的轿车有什么缺点?为什么有些人认为买混动车的人很少? java请随机输入10个数字保存到List中,并按倒序显示出来 如何反向遍历List集合 .vip是哪里的域名 jsp生成的列表能按倒序排列吗 把&quot;a;b;c;d;e;f&quot;倒序的最好算法? 在域名中的.site, .top,.com,.vip之类的都什么区别 java中LinkedList 倒序输出 vip域名是哪个国家的 vip域名是哪个国家的 c++链表实现链表的翻转,即倒序输出 重新定义一个链表,将原来连表中的数据倒着插进去。 VIP域名对企业建站有什么重要价值 VIP域名对企业建站有什么重要价值 vip域名能不能备案 vip域名能不能备案 .vip域名权重怎么样 vip域名多少钱 com.cn域名和vip域名哪个好? com.cn域名和vip域名哪个好? vip域名多少钱一年 可以备案吗 vip域名注册多少钱一年,以及vip域名注册的优势