java:函数--返回多个值

来源:互联网 发布:系统解剖学网络公开课 编辑:程序博客网 时间:2024/05/21 11:23

在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!!

网上这个问题的解决方法:

1、使用集合类使用map返回值;这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过源代码来查看。

2、使用引用传递传入一个引用进去,修改引用的属性值。问题:不实用。

3、使用封装对象通过泛型构造一个类似python的tuple类,或者构造一个JavaBean,其问题都是“一次性”,觉的不优雅。

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. public class Test {
  4. /**
  5. * 方法1:使用集合类 (Map以外的集合类也可以随意使用)
  6. * 目标:返回一个数组的最大值和最小值
  7. */
  8. public Map<String, Integer> test1(int[] arr) {
  9. Map<String, Integer> map = new HashMap<String, Integer>();
  10. int max = Integer.MIN_VALUE;
  11. int min = Integer.MAX_VALUE;
  12. for (int i = 0; i < arr.length; i++) {
  13. if (arr[i] > max) {
  14. max = arr[i];
  15. }
  16. if (arr[i] < min) {
  17. min = arr[i];
  18. }
  19. }
  20. map.put("max", max);
  21. map.put("min", min);
  22. return map;
  23. }
  24. /**
  25. * 方法2:使用封装对象
  26. * 目标:返回一个数组的最大值和最小值
  27. */
  28. public Result test2(int[] arr) {
  29. Result result = new Result();
  30. int max = Integer.MIN_VALUE;
  31. int min = Integer.MAX_VALUE;
  32. for (int i = 0; i < arr.length; i++) {
  33. if (arr[i] > max) {
  34. max = arr[i];
  35. }
  36. if (arr[i] < min) {
  37. min = arr[i];
  38. }
  39. }
  40. result.setMax(max);
  41. result.setMin(min);
  42. return result;
  43. }
  44. /**
  45. * 方法3:使用引用传递 (不适用基本类型及其封装类和String类型)
  46. * 目标:返回数组长度,同时获取最大值和最小值
  47. */
  48. public int test3(int[] arr, Result result) {
  49. int max = Integer.MIN_VALUE;
  50. int min = Integer.MAX_VALUE;
  51. for (int i = 0; i < arr.length; i++) {
  52. if (arr[i] > max) {
  53. max = arr[i];
  54. }
  55. if (arr[i] < min) {
  56. min = arr[i];
  57. }
  58. }
  59. result.setMax(max);
  60. result.setMin(min);
  61. int total = arr.length;
  62. return total;
  63. }
  64. /**
  65. * 测试main
  66. */
  67. public static void main(String[] args) {
  68. Test t = new Test();
  69. int[] arr = { 1, 2, 3, 4, 5, 6 };
  70. // ----------方法1测试-----------
  71. // Map<String, Integer> map = t.test1(arr);
  72. // System.out.println("max : " + map.get("max"));
  73. // System.out.println("min : " + map.get("min"));
  74. // ----------方法2测试-----------
  75. // Result result = t.test2(arr);
  76. // System.out.println("max : " + result.getMax());
  77. // System.out.println("min : " + result.getMin());
  78. // ----------方法3测试-----------
  79. Result result = new Result();
  80. int total = t.test3(arr, result);
  81. System.out.println("total : " + total);
  82. System.out.println("max : " + result.getMax());
  83. System.out.println("min : " + result.getMin());
  84. }
  85. }
  86. class Result {
  87. int max;
  88. int min;
  89. // 构造函数
  90. public Result() {
  91. super();
  92. }
  93. // getters/setters(略)
  94. }

个人解决方案:

  • 使用EnumMap作为返回值类型,自己定义一个enum,将可能返回的属性名定义为enum取值即可。
  1. package com.cy;
  2. import java.util.EnumMap;
  3. /**
  4. * Created by on 2014/7/10.
  5. */
  6. public interface TestService {
  7. enum UserInfoProperty {
  8. ROOM,CELLPHONE,Name
  9. }
  10. public EnumMap<UserInfoProperty,Object> getUserInfoByName(String name);
  11. }
  • 实现类
  1. public class TestServiceImpl implements TestService {
  2. @Override
  3. public EnumMap<UserInfoProperty, Object> getUserInfoByName(String name) {
  4. EnumMap<UserInfoProperty,Object> retMap = new EnumMap<UserInfoProperty, Object>(UserInfoProperty.class);
  5. retMap.put(UserInfoProperty.ROOM,"0003");
  6. retMap.put(UserInfoProperty.CELLPHONE,"00004");
  7. retMap.put(UserInfoProperty.Name,name);
  8. return retMap;
  9. }
  10. }
  • main入口
  1. public class App
  2. {
  3. public static void main( String[] args )
  4. {
  5. TestService testService = new TestServiceImpl();
  6. String name = "testName";
  7. EnumMap<TestService.UserInfoProperty,Object> userInfo = testService.getUserInfoByName(name);
  8. userInfo.entrySet().iterator();
  9. System.out.println(userInfo.get(TestService.UserInfoProperty.Name));
  10. System.out.println(userInfo.get(TestService.UserInfoProperty.ROOM));
  11. System.out.println(userInfo.get(TestService.UserInfoProperty.CELLPHONE));
  12. }
  13. }

补充:EnumMap

以下内容基于jdk1.7.0_79源码;

什么是EnumMap

Map接口的实现,其key-value映射中的key是Enum类型;

补充说明

其原理就是一个对象数组,数组的下标索引就是根据Map中的key直接获取,即枚举中的ordinal值;

效率比HashMap高,可以直接获取数组下标索引并访问到元素;

简单示例

比较简单,源代码就不一一添加注释了,简单地说,就是一个对象数组;

这里稍微了解一下怎么使用就好了,下面列出一些方法的调用示例:

  1. package com.pichen.collection;
  2. import java.util.EnumMap;
  3. import java.util.Map;
  4. import java.util.Map.Entry;
  5. enum Operate{
  6. ADD, UPDATE, DELETE;
  7. }
  8. public class Main {
  9. public static void main(String[] args) {
  10. Map<Operate, String> map = new EnumMap<Operate, String>(Operate.class);
  11. //put方法
  12. map.put(Operate.ADD, "add operate");
  13. map.put(Operate.UPDATE, "update operate");
  14. map.put(Operate.DELETE, "delete operate");
  15. //重写了toString方法
  16. System.out.println(map);
  17. //size方法
  18. System.out.println(map.size());
  19. System.out.println(map.containsKey(Operate.UPDATE));
  20. System.out.println(map.containsValue("update operate"));
  21. System.out.println(map.get(Operate.DELETE));
  22. //remove
  23. map.remove(Operate.UPDATE);
  24. System.out.println(map);
  25. //key集合
  26. for(Operate operate:map.keySet()){
  27. System.out.print(operate + " ");
  28. }
  29. System.out.println();
  30. //value集合
  31. for(String obj:map.values()){
  32. System.out.print(obj + ",");
  33. }
  34. System.out.println();
  35. //key-value集合
  36. for(Entry<Operate, String> entry:map.entrySet()){
  37. System.out.print(entry.getKey() + ": " + entry.getValue() + ", ");
  38. }
  39. }
  40. }
输出结果:
  1. {ADD=add operate, UPDATE=update operate, DELETE=delete operate}
  2. 3
  3. true
  4. true
  5. delete operate
  6. {ADD=add operate, DELETE=delete operate}
  7. ADD DELETE 
  8. add operate,delete operate,
  9. ADD: add operate, DELETE: delete operate, 



来源: http://www.cnblogs.com/chenpi/archive/2016/03/19/5296330.html
来源:http://www.cnblogs.com/beiyeren/p/3835548.html
原创粉丝点击