ITPub博客

首页 > 应用开发 > Java > JAVA Collections.sort方法在SSH三大框架中使用中的问题

JAVA Collections.sort方法在SSH三大框架中使用中的问题

原创 Java 作者:清风艾艾 时间:2018-10-31 20:54:39 0 删除 编辑

      最近,一同学在开发中遇到了SSH三大框架中使用到了Collections.sort方法。然而,他开发环境中的JDK

是1.7.0_64,网站部署的JDK版本是1.7.0_80,他通过开发环境中产生的.class直接去更新网站部署环境中的.class

文件后,程序相关功能模块执行到Collections.sort不继续执行也不报错,而前台ajax因此取不到数据。

类似的远程如下:

public String analysisBillByIllName(){
		if(!"".equals(queryItem)){			
			List<IllnessPrescriptionFrequency> ipflist = ipfs.findByIllName(queryItem);
			List<BillView> bvlist = new ArrayList<BillView>();
			if(ipflist.size()!=0){				
				int sumfreq = 0;
				for(IllnessPrescriptionFrequency inst:ipflist){
					if(!"".equals(inst.getId().getBillIds())){						
						String[] bids = inst.getId().getBillIds().split("\\$");
						for(int i=0;i<bids.length;i++){
								BillView bv = new BillView();
								bv.setBillId(Integer.parseInt(bids[i]));
								bv.setFrequency(inst.getId().getPrescriptionFreequency());
								sumfreq +=inst.getId().getPrescriptionFreequency();
								bvlist.add(bv);
						}
					}
				}
				for(int j=0;j<bvlist.size();j++){
					for(int k=j+1;k<bvlist.size() -1;k++){
						if(bvlist.get(j).getBillId().equals(bvlist.get(k).getBillId())){
							bvlist.get(j).setFrequency(bvlist.get(j).getFrequency()+bvlist.get(k).getFrequency());
							bvlist.remove(k);
						}
					}
				}
				System.out.println(">>>>>>>>>>bvlist for2 ipflist:"+bvlist.size());
				final int sumRatio = sumfreq; 
				Collections.sort(bvlist,new Comparator<BillView>(){//list sort
					public int compare(BillView bv1,BillView bv2){
						if(bv1.getFrequency()<bv2.getFrequency()){
							return 1;
						}
						if(bv1.getFrequency()==bv2.getFrequency()){
							return 0;
						}
						return -1;
					}
				});
				System.out.println(">>>>>>>>>>bvlist Collections:"+bvlist.size());
				for(BillView bv:bvlist){
					Bill qb = bills.findById(bv.getBillId());
					bv.setBillName(qb.getBillName());
					float divd = bv.getFrequency()/sumRatio;
					bv.setUseageRatio(divd);
					bv.setIllName(queryItem);
				}
				flag="data";
				jsonArray = JSONArray.fromObject(bvlist);
				System.out.println(jsonArray.toString());
				return SUCCESS;
			}else{
				flag="none";
				return SUCCESS;
			}
		}else{
			return ERROR;
		}
	}

如上程序通过AJAX异步访问,在开发环境中能正常执行;但是使用低版本的JDK编译后的.class文件直接去替换高版本下

的同名.class文件类,程序执行到:

System.out.println(">>>>>>>>>>bvlist for2 ipflist:"+bvlist.size());

而下边的方法不执行也不报错:

Collections.sort(bvlist,new Comparator<BillView>(){//list sort
					public int compare(BillView bv1,BillView bv2){
						if(bv1.getFrequency()<bv2.getFrequency()){
							return 1;
						}
						if(bv1.getFrequency()==bv2.getFrequency()){
							return 0;
						}
						return -1;
					}
				});

程序无法执行Collections.sort,不能执行到函数返回语句,AJAX异步访问获取不到数据,导致前台报错获取数据失败。

    在问题排查过程中,经历了如下过程:

    1、开发环境是windows,网站部署环境是centos6.8,前后重新编译了网站代码,并且重新部署了centos上的网站,

问题还是不执行Collections.sort;

    2、怀疑是阿里云环境安全的限制,关闭了主机防火墙,但是Collections.sort方法还是不执行也不报错;

    3、单独编辑测试Collections.sort的java类分别在windows和centos环境下编译执行,发现Collections.sort在windows和centos上均可以执行,测试程序如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class BillView{
	private Integer billId;
	private String billName;
	private String illName;
	private int frequency;
	private float useageRatio;
	public Integer getBillId() {
		return billId;
	}
	public void setBillId(Integer billId) {
		this.billId = billId;
	}
	public String getBillName() {
		return billName;
	}
	public void setBillName(String billName) {
		this.billName = billName;
	}
	public String getIllName() {
		return illName;
	}
	public void setIllName(String illName) {
		this.illName = illName;
	}
	public int getFrequency() {
		return frequency;
	}
	public void setFrequency(int frequency) {
		this.frequency = frequency;
	}
	public float getUseageRatio() {
		return useageRatio;
	}
	public void setUseageRatio(float useageRatio) {
		this.useageRatio = useageRatio;
	}
	
	public BillView() {
		
	}
	public BillView(Integer billId, String billName, String illName,
			int frequency, float useageRatio) {
		super();
		this.billId = billId;
		this.billName = billName;
		this.illName = illName;
		this.frequency = frequency;
		this.useageRatio = useageRatio;
	}
}
public class Test {
	
	public static void main(String[] args){
		List<BillView> bvlist = new ArrayList<BillView>();
		BillView bv1 = new BillView(1, "苹果", null, 1, 0); 
		BillView bv2 = new BillView(2, "香蕉", null, 4, 0);
		BillView bv3 = new BillView(3, "橘子", null, 2, 0);
		BillView bv4 = new BillView(4, "梨", null, 9, 0);
		bvlist.add(bv1);
		bvlist.add(bv2);
		bvlist.add(bv3);
		bvlist.add(bv4);
		Collections.sort(bvlist,new Comparator<BillView>(){//list sort
			public int compare(BillView bv1,BillView bv2){
				if(bv1.getFrequency()<bv2.getFrequency()){
					return 1;
				}
				if(bv1.getFrequency()==bv2.getFrequency()){
					return 0;
				}
				return -1;
			}
		});
		System.out.println("collections --->"+bvlist.size());
		for(BillView bv:bvlist){
			System.out.println("  "+bv.getBillName()+"  "+bv.getFrequency());
		}
	}
}

  4、查看windows和centos环境下的JDK版本,发现两边环境JDK版本不一致,windows环境下jdk版本是:1.7.0_64,而

centos环境下JDK版本是1.7.0_80;将windows环境下JDK版本更新到1.7.0_80,并指定开发工具myeclipse的Java编译使用

JDK1.7.0_80版本,重新编译网站源码,在centos上发布网站,发现如下程序顺利执行:

Collections.sort(bvlist,new Comparator<BillView>(){//list sort
					public int compare(BillView bv1,BillView bv2){
						if(bv1.getFrequency()<bv2.getFrequency()){
							return 1;
						}
						if(bv1.getFrequency()==bv2.getFrequency()){
							return 0;
						}
						return -1;
					}
				});

  到此问题得到了解决!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29357786/viewspace-2218298/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
个人喜欢IT行业,目前从事数据库工作,包括Oracle、mysql、mongodb、sqlserver等数据库的维护,喜欢专研开发技术,尤其对java程序的开发感兴趣。工作经历上,在中国联通系统集成公司、中公网医疗信息技术有限公司做过数据库技术支持;目前在海量数据,负责华东区oracle、mysql、mongodb的维护工作。

注册时间:2015-01-30

  • 博文量
    176
  • 访问量
    204549