2017-01-25 195 views
1

我目前正在编写一个Java程序,它将值显示到AreaChart中,并且为此我有一个名为dataList的ArrayList,其类型为AreaChartPairJava - 如何避免此重复代码

每个AreaChartPair包含一个X轴(字符串)值和一个Y轴(整数)值。

X轴是日期,Y轴是一个计数器,因为所有数据都是从文件中读取的,日期将是未排序的顺序。我用这个功能来对它们进行排序:

dataList.sort(Comparator.comparing(AreaChartPair::getXAxisStringValue));

这是没有完全解决我的问题,因为它只会比前几个字母数字字符(即02.09.2030会来01.01.2000后,因为02自带01后)

为了解决这个问题,我根本扭转的日期从dd.mm.yyyyyyyy.mm.dd,整理与上面的功能列表,之后逆转的字符串返回dd.mm.yyyy

我现在的问题是我怎么能简化的代码块,因为它是重复的:

//replaces the current data with the reversed string 
for (int index = 0; index < dataList.size(); index++) { 
    dataList.set(index, new AreaChartPair(model.reverseDate(dataList.get(index).getXAxisStringValue()), 
     dataList.get(index).getYAxisIntegerValue())); 
} 

//sorts the data 
dataList.sort(Comparator.comparing(AreaChartPair::getXAxisStringValue)); 

//reverses the string back to normal, so it can be displayed 
for (int index = 0; index < dataList.size(); index++) { 
    dataList.set(index, new AreaChartPair(model.reverseDate(dataList.get(index).getXAxisStringValue()), 
     dataList.get(index).getYAxisIntegerValue())); 
} 

有什么建议?

+0

创建一个自定义的比较器,做反向比较? – RobAu

回答

5

执行排序的较短途径是在运行中进行换向。该字符串也可以解析为一个真正的日期对象,使其更清洁,但这需要catch块和dateformatter对象,所以我不会在这里编写代码。

dataList.sort(Comparator.comparing(AreaChartPair::getXAxisStringValue, 
    (a, b) -> { 
     return model.reverseDate(a).compareTo(model.reverseDate(b)); 
})); 
+0

工程就像一个魅力:)但我想你可能已经忘记了最后的大括号 –

+1

这只是为了检查你是否注意;) – Kayaman

1

也许做一个方法出来的:

AreaChartPair areaChartPair = new AreaChartPair(model.reverseDate(dataList.get(index).getXAxisStringValue()), 
      dataList.get(index).getYAxisIntegerValue()); 
public DataListType dataListSorter(DataListType datalist, AreaChartPair areaChartPair) { 
    for (int index = 0; index < dataList.size(); index++) { 
     dataList.set(index, areaChartPair); 
    } 
return dataList; 
} 

dataList = dataListSorter(dataList); 
dataList.sort(Comparator.comparing(AreaChartPair::getXAxisStringValue)); 
dataList = dataListSorter(dataList); 

还是重复的,虽然。如果你要在整个应用程序中反复执行此操作,可能最有用的方法是这样做。

+0

这可能是我的问题的有效解决方案。对我来说唯一的问题就是这一行:'.set(index,new AreaChartPair(...)',因为新的AreaChartPair(...)将被硬编码,是否有办法让这个更动态?尝试参数化一个'对象'类型的方法,但不能创建一个新的类实例外 –