java自定义容器排序的两种方法

首先说一下排序的返回值的含义。对于参与比较的两个Object,o1和o2,如果函数的返回值为正值,把o1排在o2后面;返回值为负值,把o1排在o2前面。如果返回值是0,按照容器之前的顺序排列。在compareTo中,this相当于o1,传入的Object相当于o2

第一种方法:对于要排序的类实现Comparable接口

package sort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
//采用实现Comparable接口的方法实现排序
class S1 implements Comparable{
	int x;
	int y;
	S1(int x, int y){
		this.x = x;
		this.y = y;
	}
	//实现排序方法。先比较x,如果相同比较y
	@Override
	public int compareTo(Object o) {
		S1 obj = (S1) o;
		if(x != obj.x)
		{
			return x - obj.x;
		}
		return y - obj.y;
	}
	//重写toStirng方法,改变println时的显示效果
	public String toString(){
		return "("+x+", "+y+")";
	}
}

public class Sort1 {
	public static void main(String[] args) {
		List<S1> s1Set = new ArrayList<S1>();
		S1 s1 = new S1(3,5);
		S1 s2 = new S1(2,5);
		S1 s3 = new S1(2,2);
		s1Set.add(s1);
		s1Set.add(s2);
		s1Set.add(s3);
		//对容器进行排序的函数
		Collections.sort(s1Set);
		Iterator it = s1Set.iterator();
		while(it.hasNext())
		{
			System.out.println(it.next());
		}
	}
}

 

第二种方法:覆盖Comparator中的compare方法。

package sort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

class S2{
	int x;
	int y;
	S2(int x, int y){
		this.x = x;
		this.y = y;
	}
	//重写toStirng方法,改变println时的显示效果
	public String toString(){
		return "("+x+", "+y+")";
	}
}

public class Sort2 {
	public static void main(String[] args) {
		List<S2> s2Set = new ArrayList<S2>();
		S2 s1 = new S2(3,5);
		S2 s2 = new S2(4,5);
		S2 s3 = new S2(4,2);
		s2Set.add(s1);
		s2Set.add(s2);
		s2Set.add(s3);
		//对容器进行排序的函数
		Collections.sort(s2Set,c);
		Iterator it = s2Set.iterator();
		while(it.hasNext())
		{
			System.out.println(it.next());
		}	
	}
	static Comparator<S2> c = new Comparator(){
		public int compare(Object a0, Object a1) {
			S2 s1 = (S2) a0;
			S2 s2 = (S2) a1;
			if(s1.x != s2.x)
			{
				return s1.x - s2.x;
			}
			else
			{
				return s1.y - s2.y;
			}
		}
	};
	
}


 

### Java中HashList排序方法及实现方式 在Java中,`HashList` 并不是一个标准的数据结构名称。通常情况下,可能是指 `ArrayList<HashMap<K,V>>` 或者类似的复合数据结构。如果要对这种类型的集合进行排序,则需要明确以下几个方面: 1. **确定排序依据**:是按照 `HashMap` 的 key 还是 value 来排序? 2. **选择合适的工具类**:可以使用 `Collections.sort()` 配合自定义的 Comparator 实现排序[^3]。 3. **Lambda表达式的应用**:通过 Lambda 表达式简化 Comparator 的编写过程[^1]。 以下是针对不同场景的具体实现方式: #### 场景一:按 HashMap 的 Key 排序 当 `HashList` 是指一个包含多个 `HashMap<String, Integer>` 的列表时,可以通过以下代码实现按键排序: ```java import java.util.*; public class Main { public static void main(String[] args) { List<Map<String, Integer>> hashList = new ArrayList<>(); Map<String, Integer> map1 = new HashMap<>(); map1.put("bc", 10); map1.put("ad", 5); Map<String, Integer> map2 = new HashMap<>(); map2.put("cb", 8); map2.put("ad", 7); hashList.add(map1); hashList.add(map2); // 使用流操作提取所有的键并去重后再排序 List<String> sortedKeys = hashList.stream() .flatMap(m -> m.keySet().stream()) .distinct() .sorted() // 默认字典顺序 .toList(); System.out.println(sortedKeys); // 输出 ["ad", "bc", "cb"] } } ``` #### 场景二:按 HashMap 的 Value 排序 对于同样的 `HashList` 数据结构,也可以根据值来进行排序。下面是一个例子展示如何完成此任务: ```java import java.util.*; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Map<String, Integer>> hashList = new ArrayList<>(); Map<String, Integer> map1 = new HashMap<>(); map1.put("bc", 10); map1.put("ad", 5); Map<String, Integer> map2 = new HashMap<>(); map2.put("cb", 8); map2.put("ad", 7); hashList.add(map1); hashList.add(map2); // 提取所有条目并将它们合并到单个列表中以便于后续处理 List<Map.Entry<String, Integer>> entries = hashList.stream() .flatMap(m -> m.entrySet().stream()) // 将每个Map转成Entry Stream再拼接起来 .collect(Collectors.toList()); // 按照Value降序排列这些entries Collections.sort(entries, (entry1, entry2) -> entry2.getValue().compareTo(entry1.getValue())); // 打印结果 for (var entry : entries){ System.out.println(entry.getKey()+":"+entry.getValue()); } /* 可能输出如下(具体取决于输入数据) bc:10 cb:8 ad:7 ad:5 */ } } ``` 上述代码片段展示了两种不同的排序策略——一种基于Key另一种基于Value,并且都利用到了现代Java特性如Stream API 和 lambda expressions来提高可读性和效率[^4][^5]。 ### 注意事项 - 如果存在重复项而希望保留唯一性,在收集阶段就应该考虑去除冗余记录或者调整比较逻辑以适应业务需求。 - 当涉及到复杂对象比如 Student 类型作为元素存在于 list 中时候,记得提供清晰无误的 equals/hashCode 定义以及定制化 comparator 函数[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值