我在 Java 的 ArrayList 中有以下資料。我正在嘗試按一年中的月份對其進行排序。它應該按 12 月、11 月等排序。我嘗試了不同的技術,但這些都不起作用。
| 月 | 特征名稱 | 特征計數 | 應用名稱 |
|---|---|---|---|
| 四月 | 登錄 | 1 | 手機銀行 |
| 四月 | 登錄 | 1 | 零售銀行門戶 |
| 四月 | S3 | 1 | 手機銀行 |
| 四月 | 更新個人資訊 | 1 | 市場研究門戶 |
| 四月 | 更新個人資訊 | 1 | 零售銀行門戶 |
| 十二月 | 登錄 | 1 | 零售銀行門戶 |
| 十二月 | 更換 PAN 卡 | 1 | 零售銀行門戶 |
| 十二月 | 更新個人資訊 | 1 | 零售銀行門戶 |
| 十二月 | 更新用戶資料 api | 1 | 零售銀行門戶 |
| 一月 | FI解凍PAN卡 | 1 | 零售銀行門戶 |
| 一月 | 登錄 | 1 | 零售銀行門戶 |
| 一月 | 更換 PAN 卡 | 1 | 零售銀行門戶 |
| 行進 | 登錄 | 1 | 零售銀行門戶 |
| 行進 | 更新個人資訊 | 1 | 零售銀行門戶 |
| 十一月 | 登錄 | 1 | 零售銀行門戶 |
| 十一月 | 更換 PAN 卡 | 1 | 零售銀行門戶 |
| 十月 | 更換 PAN 卡 | 1 | 零售銀行門戶 |
| 十月 | S3 | 1 | 零售銀行門戶 |
| 十月 | 查看帳戶摘要 | 1 | 零售銀行門戶 |
這是我的代碼:
public class FeatureAnalyzeDTO {
private String featureName;
private String month;
private int featureCount;
private String appName;
private int featureCountForAMonth;
private double percentage;
private int cumulativeSum;
}
List<FeatureAnalyzeDTO> featureAnalyzeDTOList = getFeatureAnalyzeDTOS(featureAnalyzeInterfaceList);
我曾嘗試使用比較器,但沒有奏效。我如何按月份名稱對其進行排序?
uj5u.com熱心網友回復:
首先,創建一個包含 January 到 December 的 monthList。
List<String> monthList = Arrays.asList("January", "February", "March", "April",
"May", "June", "July", "August", "September",
"October", "November", "December");
然后,使用List.sort執行Comparator哪個按降序比較月份。
featureAnalyzeInterfaceList.sort((dto1, dto2) -> {
if (monthList.indexOf(dto1.month) > monthList.indexOf(dto2.month)) {
return -1;
} else if (monthList.indexOf(dto1.month) < monthList.indexOf(dto2.month)) {
return 1;
}
return 0;
});
uj5u.com熱心網友回復:
如果您使用的是 java8,請嘗試以下代碼
List<FeatureAnalyzeDTO> featureAnalyzeInterfaceListUpdated= featureAnalyzeInterfaceList.stream().sorted(
Comparator.comparingInt(o -> Month.valueOf(o.month.toUpperCase()).getValue())).collect(Collectors.toList());
uj5u.com熱心網友回復:
如果您至少使用 Java 8,那么您應該使用java.time.Month 列舉。我在下面的代碼中使用它。
如果您使用 [至少] Java 14,那么您可以使用 arecord而不是類。請參閱JEP 395。在下面的代碼中,FeatureAnalyzeDTO是記錄而不是類。我假設[class] 名稱中的DTO表示資料傳輸物件,這對我來說意味著它可能需要可序列化。請注意,java 記錄也可以是可序列化的。請參閱 Chris Hegarty 題為Serializable Records的文章。使用記錄只是讓您免于撰寫常用方法,包括getter、equals和toString。但是請注意,記錄是 [意味著]不可變的。
在下面的代碼中,我創建了一個List實體FeatureAnalyzeDTO以及一個比較器,用于按月對串列進行降序排序,即12月FeatureAnalyzeDTO的實體在串列中排在首位,而1 月的實體排在最后。是通過lambda 運算式實作的。Java 8 中添加了 Lambda 運算式。monthmonthComparator
import java.io.Serializable;
import java.time.Month;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public record FeatureAnalyzeDTO(String featureName,
String month,
int featureCount,
String appName) implements Serializable {
public static void main(String[] args) {
List<FeatureAnalyzeDTO> list = new ArrayList<>(List.of(new FeatureAnalyzeDTO("login", "April", 1, "Mobile Banking"),
new FeatureAnalyzeDTO("login", "April", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("S3", "April", 1, "Mobile Banking"),
new FeatureAnalyzeDTO("update profile", "April", 1, "Markets Research Portal"),
new FeatureAnalyzeDTO("update profile", "April", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("login", "December", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("Replace PAN Card", "December", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("update profile", "December", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("update user profile api", "December", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("FI unfreeze PAN Card", "January", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("login", "January", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("Replace PAN Card", "January", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("login", "March", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("update profile", "March", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("login", "November", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("Replace PAN Card", "November", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("Replace PAN Card", "October", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("S3", "October", 1, "Retail Bank Portal"),
new FeatureAnalyzeDTO("View Account Summary", "October", 1, "Retail Bank Portal")));
Comparator<FeatureAnalyzeDTO> comp = (o1, o2) -> Month.valueOf(o2.month().toUpperCase()).getValue() - Month.valueOf(o1.month().toUpperCase()).getValue();
list.sort(comp);
list.forEach(System.out::println);
}
}
運行上面的代碼會產生以下結果:
FeatureAnalyzeDTO[featureName=login, month=December, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=Replace PAN Card, month=December, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=update profile, month=December, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=update user profile api, month=December, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=login, month=November, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=Replace PAN Card, month=November, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=Replace PAN Card, month=October, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=S3, month=October, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=View Account Summary, month=October, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=login, month=April, featureCount=1, appName=Mobile Banking]
FeatureAnalyzeDTO[featureName=login, month=April, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=S3, month=April, featureCount=1, appName=Mobile Banking]
FeatureAnalyzeDTO[featureName=update profile, month=April, featureCount=1, appName=Markets Research Portal]
FeatureAnalyzeDTO[featureName=update profile, month=April, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=login, month=March, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=update profile, month=March, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=FI unfreeze PAN Card, month=January, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=login, month=January, featureCount=1, appName=Retail Bank Portal]
FeatureAnalyzeDTO[featureName=Replace PAN Card, month=January, featureCount=1, appName=Retail Bank Portal]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468047.html
