2017-01-25 5 views
1

私は現在AreaChartに値を表示するJavaプログラムを作成しています。そのため、汎用タイプAreaChartPairからdataListという名前のArrayListを持っています。Java - この繰り返しコードを避けるには

AreaChartPairには、X軸(String)値とY軸(Integer)値が含まれています。

X軸は日付で、Y軸はカウンタであり、すべてのデータがファイルから読み込まれるため、日付は並べ替えられていません。それが唯一の最初の数文字の英数字を比較するので、完全に、私の問題を解決していない

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

0201の後に来るので、すなわち02.09.2030は、01.01.2000後に来る)

:それらを並べ替えるために、私はこの機能を使用します私は単に yyyy.mm.dddd.mm.yyyyから日付を逆転し、この問題を解決するために

は、上記の関数でリストをソートし、その後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(...)はハードコードされているので、これをもっと動的にする方法はありますか?メソッドに 'Object'型をパラメータ化しようとしましたが、その中から新しいクラスインスタンスを作成できませんでした –

関連する問題