排序问题
排序问题是最为常见的问题,但是同时支持多个字段属性排序,也是很常见,本节只针对单个属性进行排序而言,而非支持多个属性同时排序,这个在这里就不做过多的介绍。需求
可以支持多个属性字段属性排序- 代码
import java.text.DecimalFormat;
/**
* User: ysl
* Date: 2017/1/2
* Time: 16:39
*/
public class OperationDetailStatisticsRow implements Comparable {
private String sortName = "invokedCount"; //排序字段
private String updown="up"; //升序还是降序
private long invokedCount; // 调用次数
private long successCount; // 成功次数
private long validCount; // 有效次数
private long inputCount; // 输入记录数
private long outputCount; // 输出记录数
private String outputRate; // 输出有效比
private String validRate; // 调用有效比例
private String email; // 用户邮箱
private String company; // 服务名称
public OperationDetailStatisticsRow() {
}
public OperationDetailStatisticsRow(long invokedCount, long successCount, long validCount,
long inputCount, long outputCount, String email,
String company,String sortName,String updown) {
DecimalFormat df = new DecimalFormat("##.00");
this.sortName = sortName;
this.updown = updown;
this.invokedCount = invokedCount;
this.successCount = successCount;
this.validCount = validCount;
this.inputCount = inputCount;
this.outputCount = outputCount;
this.email = email;
this.company = company;
if(invokedCount>0)
{
double result = validCount*100/invokedCount;
if(result>0)
{
this.validRate = df.format(result)+"%";
}else{
this.validRate = "0%";
}
}else {
this.validRate = "0%";
}
if(inputCount>0)
{
double result = outputCount*100/inputCount;
if(result>0)
{
this.outputRate = df.format(result)+"%";
}else{
this.outputRate = "0%";
}
}else{
this.outputRate = "0%";
}
}
@Override
public int compareTo(Object o) {
int ret = 0;
switch (sortName)
{
case "invokedCount":
ret = (int)(this.getInvokedCount()- ((OperationDetailStatisticsRow)o).getInvokedCount());
break;
case "successCount":
ret = (int)(this.getSuccessCount()- ((OperationDetailStatisticsRow)o).getSuccessCount());
break;
case "validCount":
ret = (int)(this.getValidCount()- ((OperationDetailStatisticsRow)o).getValidCount());
break;
case "inputCount":
ret = (int)(this.getInputCount()- ((OperationDetailStatisticsRow)o).getInputCount());
break;
case "outputCount":
ret = (int)(this.getOutputCount() - ((OperationDetailStatisticsRow)o).getOutputCount());
break;
case "outputRate":
String s1 = this.getOutputRate();
String s2 = ((OperationDetailStatisticsRow)o).getOutputRate();
double number1 = Double.valueOf(s1.substring(0, s1.lastIndexOf("%")));
double number2 = Double.valueOf(s2.substring(0,s2.lastIndexOf("%")));
// ret = this.getOutputRate().toString().compareTo(((OperationStatisticsRow)o).getOutputRate().toString());
ret = number1 >= number2?1:-1;
break;
case "validRate":
String s3 = this.getValidRate();
String s4 = ((OperationDetailStatisticsRow)o).getValidRate();
double number3 = Double.valueOf(s3.substring(0, s3.lastIndexOf("%")));
double number4 = Double.valueOf(s4.substring(0,s4.lastIndexOf("%")));
ret = number3 > number4?1:-1;
//ret = this.getValidRate().toString().compareTo(((OperationStatisticsRow) o).getValidRate().toString());
break;
default:
break;
}
if("down".equals(updown))
{
ret = -ret;
}
return ret;
}
public long getInvokedCount() {
return invokedCount;
}
public void setInvokedCount(long invokedCount) {
this.invokedCount = invokedCount;
}
public long getSuccessCount() {
return successCount;
}
public void setSuccessCount(long successCount) {
this.successCount = successCount;
}
public long getValidCount() {
return validCount;
}
public void setValidCount(long validCount) {
this.validCount = validCount;
}
public long getInputCount() {
return inputCount;
}
public void setInputCount(long inputCount) {
this.inputCount = inputCount;
}
public long getOutputCount() {
return outputCount;
}
public void setOutputCount(long outputCount) {
this.outputCount = outputCount;
}
public String getOutputRate() {
return outputRate;
}
public void setOutputRate(String outputRate) {
this.outputRate = outputRate;
}
public String getValidRate() {
return validRate;
}
public void setValidRate(String validRate) {
this.validRate = validRate;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Override
public String toString() {
return "OperationDetailStatisticsRow{" +
"invokedCount=" + invokedCount +
", successCount=" + successCount +
", validCount=" + validCount +
", inputCount=" + inputCount +
", outputCount=" + outputCount +
", outputRate='" + outputRate + '\'' +
", validRate='" + validRate + '\'' +
", email='" + email + '\'' +
", company='" + company + '\'' +
'}';
}
}
List<OperationStatisticsRow> operationStatisticsRowList = new ArrayList<OperationStatisticsRow>();
.....................................
OperationStatisticsRow osr = new OperationStatisticsRow(activeUserCount,invokedCount,successCount, validCount,inputCount,outputCount,serviceId,sort,asc);
.....................................
........................
Collections.sort(operationStatisticsRowList);
........................
4.总结
仅支持多个字段单个属性排序,对于多个字段同时排序,需另外寻求出路。求大神指点。