Java - 如何避免这种重复代码

时间:2017-01-25 07:34:59

标签: java

我目前正在编写一个将值显示在AreaChart中的Java程序,为此我从通用类型dataList获得名为AreaChartPair的ArrayList。

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

X轴是日期,Y轴是计数器,因为所有数据都是从文件中读取的,所以日期将按未排序的顺序排列。为了对它们进行排序,我使用了这个函数:

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

这并不能完全解决我的问题,因为它只会比较前几个字母数字字符(即02.09.2030后面会01.01.2000,因为02位于01之后)

要解决此问题,我只需将日期从dd.mm.yyyy改为yyyy.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()));
}

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

执行排序的更简单方法是即时进行反转。该字符串也可以解析为实际日期对象,以使其更清晰,但这需要catch块和dateformatter对象,所以我不会在这里编写该代码。

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

答案 1 :(得分: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);

但仍然重复。如果您要在整个应用程序中反复执行此操作,可能最有用的方法。