gpt4 book ai didi

java - 按字母顺序排序相当慢

转载 作者:行者123 更新时间:2023-12-02 10:52:13 25 4
gpt4 key购买 nike

这是我的问题:我有一个自定义对象列表,其中包含一个名为 label 的字符串。这个列表很大但太大了,大约有 1000 个对象。我想使用 label 按字母顺序排序.

问题是,一些 label包含字符,例如 É , ( , eE作为第一个字符。所以我不得不使用函数 deAccent()找到here独立于口音或其他类似因素对其进行排序。使用此功能列表 ['Gab','eaaa','Éaa']像这样排序['eaaa','Éaa','Gab']而不是['eaaa','Gab','Éaa'] 。因为当我们使用 compareTo方法,ÉG之后。这是我所拥有的:

private List<Formula> sortFormulaList(List<Formula> formulaList) {
// Sort all label alphabetically
if (formulaList.size() > 0) {
Collections.sort(formulaList, (formula1, formula2) ->
deAccent(formula1.getLabel()).toLowerCase().compareTo(deAccent(formula2.getLabel().toLowerCase())));
}
return formulaList;
}

private String deAccent(String str) {
String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD);
Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
return pattern.matcher(nfdNormalizedString).replaceAll("");
}

如果我不使用deAccent()对于我的目的来说它已经足够快了,但是当我使用它时,它需要大约 1 到 3 秒的时间来进行排序。

知道如何进行这样的排序吗?或者让这个更快

最佳答案

考虑@Henry的出色建议,公式可能如下所示:

public class Formula {
private final String label;
private final String deAccentedLabel;

public Formula(String label) {
this.label = label;
this.deAccentedLabel = deAccent(label);
}

public String getLabel() {
return label;
}

public String getDeAccentedLabel() {
return comparableLabel;
}


private String deAccent(String str) {
String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD);
Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
return pattern.matcher(nfdNormalizedString).replaceAll("");
}

}

然后可以这样使用:

Collections.sort(formulaList, (formula1, formula2) -> formula1.getDeAccentedLabel().toLowerCase().compareTo(formula2.getDeAccentedLabel().toLowerCase());

但是,这通过添加 public getDeAccentedLabel() 方法公开了 deAccentedLabel

我在评论中建议的是隐藏 deAccentedLabel 以保持 Formula 的公共(public)界面尽可能干净。因此,为了排序,Formula 提供了比较器而不是其他类必须构建它公式看起来像这样:

public class Formula {
private final String label;
private final String comparableLabel;

public Formula(String label) {
this.label = label;
this.comparableLabel = deAccent(label).toLowerCase();
}

public String getLabel() {
return label;
}

private String deAccent(String str) {
String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD);
Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
return pattern.matcher(nfdNormalizedString).replaceAll("");
}

public static Comparator<Formula> getLabelComparator() {
return (formula1, formula2) -> formula1.comparableLabel.compareTo(formula2.comparableLabel);
}

}

并像这样使用:

Collections.sort(formulaList, Formula.getLabelComparator());

关于java - 按字母顺序排序相当慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52081969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com