在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!!
网上这个问题的解决方法:
1、【使用集合类】使用map返回值;这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过源代码来查看。
2、【使用引用传递】传入一个引用进去,修改引用的属性值。问题:不实用。
3、【使用封装对象】通过泛型构造一个类似python的tuple类,或者构造一个JavaBean,其问题都是“一次性”,觉的不优雅。
import java.util.HashMap;
import java.util.Map;
public class Test {
/**
* 方法1:使用集合类 (Map以外的集合类也可以随意使用)
* 目标:返回一个数组的最大值和最小值
*/
public Map<String, Integer> test1(int[] arr) {
Map<String, Integer> map = new HashMap<String, Integer>();
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
if (arr[i] < min) {
min = arr[i];
}
}
map.put("max", max);
map.put("min", min);
return map;
}
/**
* 方法2:使用封装对象
* 目标:返回一个数组的最大值和最小值
*/
public Result test2(int[] arr) {
Result result = new Result();
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
if (arr[i] < min) {
min = arr[i];
}
}
result.setMax(max);
result.setMin(min);
return result;
}
/**
* 方法3:使用引用传递 (不适用基本类型及其封装类和String类型)
* 目标:返回数组长度,同时获取最大值和最小值
*/
public int test3(int[] arr, Result result) {
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
if (arr[i] < min) {
min = arr[i];
}
}
result.setMax(max);
result.setMin(min);
int total = arr.length;
return total;
}
/**
* 测试main
*/
public static void main(String[] args) {
Test t = new Test();
int[] arr = { 1, 2, 3, 4, 5, 6 };
// ----------方法1测试-----------
// Map<String, Integer> map = t.test1(arr);
// System.out.println("max : " + map.get("max"));
// System.out.println("min : " + map.get("min"));
// ----------方法2测试-----------
// Result result = t.test2(arr);
// System.out.println("max : " + result.getMax());
// System.out.println("min : " + result.getMin());
// ----------方法3测试-----------
Result result = new Result();
int total = t.test3(arr, result);
System.out.println("total : " + total);
System.out.println("max : " + result.getMax());
System.out.println("min : " + result.getMin());
}
}
class Result {
int max;
int min;
// 构造函数
public Result() {
super();
}
// getters/setters(略)
}
个人解决方案:
- 使用EnumMap作为返回值类型,自己定义一个enum,将可能返回的属性名定义为enum取值即可。
package com.cy;
import java.util.EnumMap;
/**
* Created by on 2014/7/10.
*/
public interface TestService {
enum UserInfoProperty {
ROOM,CELLPHONE,Name
}
public EnumMap<UserInfoProperty,Object> getUserInfoByName(String name);
}
- 实现类
public class TestServiceImpl implements TestService {
@Override
public EnumMap<UserInfoProperty, Object> getUserInfoByName(String name) {
EnumMap<UserInfoProperty,Object> retMap = new EnumMap<UserInfoProperty, Object>(UserInfoProperty.class);
retMap.put(UserInfoProperty.ROOM,"0003");
retMap.put(UserInfoProperty.CELLPHONE,"00004");
retMap.put(UserInfoProperty.Name,name);
return retMap;
}
}
- main入口
ublic class App
{
public static void main( String[] args )
{
TestService testService = new TestServiceImpl();
String name = "testName";
EnumMap<TestService.UserInfoProperty,Object> userInfo = testService.getUserInfoByName(name);
userInfo.entrySet().iterator();
System.out.println(userInfo.get(TestService.UserInfoProperty.Name));
System.out.println(userInfo.get(TestService.UserInfoProperty.ROOM));
System.out.println(userInfo.get(TestService.UserInfoProperty.CELLPHONE));
}
}
补充:EnumMap
什么是EnumMap
- 补充说明
- 简单示例
以下内容基于jdk1.7.0_79源码;
什么是EnumMap
Map接口的实现,其key-value映射中的key是Enum类型;
补充说明
其原理就是一个对象数组,数组的下标索引就是根据Map中的key直接获取,即枚举中的ordinal值;
效率比HashMap高,可以直接获取数组下标索引并访问到元素;
简单示例
比较简单,源代码就不一一添加注释了,简单地说,就是一个对象数组;
这里稍微了解一下怎么使用就好了,下面列出一些方法的调用示例:
package com.pichen.collection;
import java.util.EnumMap;
import java.util.Map;
import java.util.Map.Entry;
enum Operate{
ADD, UPDATE, DELETE;
}
public class Main {
public static void main(String[] args) {
Map<Operate, String> map = new EnumMap<Operate, String>(Operate.class);
//put方法
map.put(Operate.ADD, "add operate");
map.put(Operate.UPDATE, "update operate");
map.put(Operate.DELETE, "delete operate");
//重写了toString方法
System.out.println(map);
//size方法
System.out.println(map.size());
System.out.println(map.containsKey(Operate.UPDATE));
System.out.println(map.containsValue("update operate"));
System.out.println(map.get(Operate.DELETE));
//remove
map.remove(Operate.UPDATE);
System.out.println(map);
//key集合
for(Operate operate:map.keySet()){
System.out.print(operate + " ");
}
System.out.println();
//value集合
for(String obj:map.values()){
System.out.print(obj + ",");
}
System.out.println();
//key-value集合
for(Entry<Operate, String> entry:map.entrySet()){
System.out.print(entry.getKey() + ": " + entry.getValue() + ", ");
}
}
}
输出结果:
{ADD=add operate, UPDATE=update operate, DELETE=delete operate}
3
true
true
delete operate
{ADD=add operate, DELETE=delete operate}
ADD DELETE
add operate,delete operate,
ADD: add operate, DELETE: delete operate,