返回一个数组

假设你要写一个方法,而且希望它返回的不止一个值,而是一组值。这对于 C 和 C++这样
的语言来说可有点困难,因为它们不能返回一个数组,而是只能返回指向数组的指针。这
会造成一些问题,因为它使得控制数组的生命周期变得很困难,并且容易造成内存泄漏。


Java 采用类似的方法,但允许你直接“返回一个数组”。与 C++不同,使用 Java 你不需
要担心要为数组负责——只要你需要它,它就会一直存在,当你使用完后,垃圾回收器会
清理掉它。


下例演示了如何返回 String 数组:


//: c11:IceCream.java
// Returning arrays from methods.
import com.bruceeckel.simpletest.*; 
import java.util.*; 


public class IceCream { 
private static Test monitor = new Test(); 
private static Random rand = new Random();
public static final String[] flavors = { 
"Chocolate", "Strawberry", "Vanilla Fudge Swirl",
"Mint Chip", "Mocha Almond Fudge", "Rum Raisin",
"Praline Cream", "Mud Pie"

  };

public static String[] flavorSet(int n) {
    String[] results = new String[n];
boolean[] picked = new boolean[flavors.length]; 
for(int i = 0; i < n; i++) {
int t; 
do
        t = rand.nextInt(flavors.length); 
while(picked[t]);
      results[i] = flavors[t]; 
      picked[t] = true;
    }
return results; 
  }
public static void main(String[] args) { 
for(int i = 0; i < 20; i++) {
      System.out.println( 
"flavorSet(" + i + ") = ");
      String[] fl = flavorSet(flavors.length); 
for(int j = 0; j < fl.length; j++) 
        System.out.println("\t" + fl[j]); 
      monitor.expect(new Object[] {
"%% flavorSet\\(\\d+\\) = ",
new TestExpression("%% \\t(Chocolate|Strawberry|"
          + "Vanilla Fudge Swirl|Mint Chip|Mocha Almond "
          + "Fudge|Rum Raisin|Praline Cream|Mud Pie)", 8)
      });
    }
  }
} ///:~


方法 flavorSet()创建了一个名为 results 的 String 数组。此数组容量为 n,由传入方法
的参数决定。然后从数组 flavors 中随机地选择元素,存入 results 中,此方法最终返回
results 数组。返回一个数组与返回任何其他对象(本质是引用)没什么区别。数组是在
flavorSet()中被创建的,还是在别的地方被创建的并不重要。当你使用完毕后,垃圾回收
器负责清除数组,而只要你还需要它,此数组就会一直存在。


说句题外话,注意当 flavorSet()随机选择各种 flavor(数组的元素)时,它确保不会重复
选择。由一个 do 循环不断进行随机选择,直到找出一个在数组 picked 中还不存在的元素。
(当然,还会比较 String 以检查随机选择的元素是否已经在数组 results 中。)如果成功,
将此元素加入数组,然后查找下一个(i 递增)。


main() 打印 20 个完整的 flavor 的集合,因此可以看出 flavorSet() 每次确实是在随机
选择 flavor。最容易看到执行效果的方式是将输出信息重定向到一个文件。当你查看这个
文件时,要记住,你只是“想要”冰激凌,并不是“需要”冰激凌。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值