一、元组的概念
元组是指将多个数据项组合成一个不可变的序列。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类型的元组,输出第一个元组的值。
原创文章,作者:LOKV,如若转载,请注明出处:https://www.506064.com/n/138059.html