我需要一个Collection
来排序元素,但不会删除重复项。
我去了TreeSet
,因为TreeSet
实际上将值添加到支持的TreeMap
:
public boolean add(E e) {
return m.put(e, PRESENT)==null;
}
TreeMap使用Comparators
compare
逻辑删除重复项
我写了一个Comparator
,在相同元素的情况下返回1而不是0。因此,在相同元素的情况下,TreeSet
与此Comparator
将不会覆盖副本,只会对其进行排序。
我已经测试了它的简单String
对象,但我需要一组自定义对象。
public static void main(String[] args)
{
List<String> strList = Arrays.asList( new String[]{"d","b","c","z","s","b","d","a"} );
Set<String> strSet = new TreeSet<String>(new StringComparator());
strSet.addAll(strList);
System.out.println(strSet);
}
class StringComparator implements Comparator<String>
{
@Override
public int compare(String s1, String s2)
{
if(s1.compareTo(s2) == 0){
return 1;
}
else{
return s1.compareTo(s2);
}
}
}
这种方法是否正常或是否有更好的方法来实现这一目标?
编辑
实际上我有一个以下类的ArrayList:
class Fund
{
String fundCode;
BigDecimal fundValue;
.....
public boolean equals(Object obj) {
// uses fundCode for equality
}
}
我需要所有fundCode
最高的fundValue
我需要所有具有最高fundValue的fundCode
如果这是您想要排序的唯一原因,我建议不要排序。排序主要是O(n log(n))的复杂性。找到最大值只有O(n)的复杂度,并在列表上的简单迭代中实现:
List<Fund> maxFunds = new ArrayList<Fund>();
int max = 0;
for (Fund fund : funds) {
if (fund.getFundValue() > max) {
maxFunds.clear();
max = fund.getFundValue();
}
if (fund.getFundValue() == max) {
maxFunds.add(fund);
}
}
您可以通过使用Guava等第三级库来避免该代码。见:How to get max() element from List in Guava
你可以使用Collections.sort
对List进行排序。
给你的Fund
:
List<Fund> sortMe = new ArrayList(...);
Collections.sort(sortMe, new Comparator<Fund>() {
@Override
public int compare(Fund left, Fund right) {
return left.fundValue.compareTo(right.fundValue);
}
});
// sortMe is now sorted
您可以使用PriorityQueue。
PriorityQueue<Integer> pQueue =
new PriorityQueue<Integer>();
PriorityQueue():创建一个PriorityQueue,其默认初始容量(11)根据其自然顺序对其元素进行排序。
在TreeSet的情况下,Comparator或Comparable用于比较和存储对象。不调用等号,这就是为什么它不能识别重复的那个
我们可以使用List并实现Comparable接口,而不是TreeSet。
public class Fund implements Comparable<Fund> {
String fundCode;
int fundValue;
public Fund(String fundCode, int fundValue) {
super();
this.fundCode = fundCode;
this.fundValue = fundValue;
}
public String getFundCode() {
return fundCode;
}
public void setFundCode(String fundCode) {
this.fundCode = fundCode;
}
public int getFundValue() {
return fundValue;
}
public void setFundValue(int fundValue) {
this.fundValue = fundValue;
}
public int compareTo(Fund compareFund) {
int compare = ((Fund) compareFund).getFundValue();
return compare - this.fundValue;
}
public static void main(String args[]){
List<Fund> funds = new ArrayList<Fund>();
Fund fund1 = new Fund("a",100);
Fund fund2 = new Fund("b",20);
Fund fund3 = new Fund("c",70);
Fund fund4 = new Fund("a",100);
funds.add(fund1);
funds.add(fund2);
funds.add(fund3);
funds.add(fund4);
Collections.sort(funds);
for(Fund fund : funds){
System.out.println("Fund code: " + fund.getFundCode() + " Fund value : " + fund.getFundValue());
}
}
}
将元素添加到arraylist,然后使用实用程序Collections.sort对元素进行排序。然后实现可比较,并根据您的密钥编写自己的compareTo方法。
不会删除重复项,也可以排序:
List<Integer> list = new ArrayList<>();
Collections.sort(list,new Comparator<Integer>()
{
@Override
public int compare(List left, List right) {
**your logic**
return '';
}
}
)
;