一、元组的概念
元组是指将多个数据项组合成一个不可变的序列。Java不支持元组,但可以使用第三方库如javatuples或google-guava提供的元组实现。
//使用javatuples库创建元组
Unit<String> unit = Unit.with("Hello");
Pair<String,Integer> pair = Pair.with("Hello", 1);
Triplet<String,Integer,Double> triplet = Triplet.with("Hello", 1, 1.2);
//使用google-guava库创建元组
ImmutablePair<String,Integer> pair = ImmutablePair.of("Hello", 1);
ImmutableTriple<String,Integer,Double> triplet = ImmutableTriple.of("Hello", 1, 1.2);
元组可以用于返回多个值,作为函数参数传递多个参数,或者存储多个数据,方便管理。
二、元组的作为返回值
对于一个函数需要返回多个值的情况,可以使用元组作为函数的返回值。
public static Triplet<Integer,Integer,Integer> getMinMaxSum(int[] arr){
int min = arr[0];
int max = arr[0];
int sum = 0;
for(int i=0;i<arr.length;i++){
sum += arr[i];
if(arr[i] < min){
min = arr[i];
}
if(arr[i] > max){
max = arr[i];
}
}
return Triplet.with(min,max,sum);
}
//调用getMinMaxSum函数
int[] arr = {1,2,3,4,5};
Triplet<Integer,Integer,Integer> result = getMinMaxSum(arr);
System.out.println("最小值:"+result.getValue0()+";最大值:"+result.getValue1()
+";元素和:"+result.getValue2());
getMinMaxSum函数接受一个整数数组,返回该数组的最小值、最大值及所有元素的和,使用Triplet作为函数的返回值。
三、元组作为函数的参数
使用元组作为函数的参数,可以简化函数的定义,减少参数数量。
public static int arraySum(Triplet<int[],Integer,Integer> tuple){
int[] arr = tuple.getValue0();
int start = tuple.getValue1();
int end = tuple.getValue2();
int sum = 0;
for(int i=start;i<=end;i++){
sum += arr[i];
}
return sum;
}
//调用arraySum函数
int[] arr = {1,2,3,4,5};
Triplet<int[], Integer, Integer> tuple = Triplet.with(arr, 1, 3);
int sum = arraySum(tuple);
System.out.println("数组部分元素和:"+sum);
arraySum函数接受一个Triplet类型的参数,包含一个整数数组和要求和的数组下标起止位置,返回部分元素的和。
四、元组的数据存储
我们经常使用map集合存储键值对,但是有时候需要存储多个值,元组可以为我们提供存储多个值的解决方案。
Map<String,Pair<Integer,Integer>> map = new HashMap<>();
map.put("Jack", ImmutablePair.of(18,180));
map.put("Tom", ImmutablePair.of(20,175));
System.out.println("Jack的年龄:"+map.get("Jack").getValue0()+
";Jack的身高:"+map.get("Jack").getValue1());
我们使用map存储了多组键值对,键是一个字符串,值是一个二元组,包含一个整数代表年龄和一个整数代表身高。
五、多种元组的比较
不同元组的实现使用的是不同的模板参数,因此它们之间不具有可比性。Java提供了Comparable接口来实现元组之间的比较。
public class AgeComparator implements Comparator<Unit<String>>{
@Override
public int compare(Unit<String> o1, Unit<String> o2) {
int age1 = Integer.parseInt(o1.getValue0());
int age2 = Integer.parseInt(o2.getValue0());
return age1-age2;
}
}
//使用AgeComparator比较两个Unit类型的元组。
Unit<String> unit1 = Unit.with("18");
Unit<String> unit2 = Unit.with("20");
List<Unit<String>> list = new ArrayList<>();
list.add(unit1);
list.add(unit2);
Collections.sort(list, new AgeComparator());
System.out.println(list.get(0).getValue0());
通过实现比较器接口,我们可以比较不同类型的元组,上述代码中比较两个Unit类型的元组,输出第一个元组的值。