【问题标题】:java pick a random class/objectjava选择一个随机的类/对象
【发布时间】:2012-03-02 13:47:51
【问题描述】:

有没有办法从对象数组中随机选取一个对象?

我尝试了几种我能想到的方法,但都没有奏效。
我想在随机类中使用一个函数(所有类都有相同的函数但返回不同)。

我应该提到我正在尝试返回一个图像,并且每次我尝试返回一个随机图像时它都不会返回任何内容(“null”)

这是我遇到问题的一些代码:

    Car car;
    Ford ford;
    Mazda mazda
    Fiat fiat
    Rover rover   

    Car carlist[] = {ford,fiat,mazda,rover}

public void paint(){
//this displays an image every 128 pixles 
        for (int i = 0;i<Width;i+=128){

            for(int j=128; j<Height;j+=128){
// this draws the image (the image is declaired in each car's class as getImage)
                g.drawImage((car.carList[rand.nextInt(5)]).getImage(), i, j , this);
                    }
                }

如果我将一个对象放入(而不是 carcarList[rand.nextInt(5)])),则该代码有效。 每个汽车类型都扩展了 Cars。

【问题讨论】:

  • 你尝试了哪些方法?发布您遇到问题的代码
  • 0length - 1 之间生成一个随机整数(其中length 是数组的长度),并将其用作访问数组以检索对象的索引。跨度>
  • 我会发布代码,但目前在移动设备上,手边没有很抱歉
  • 它返回null,因为福特、菲亚特、马自达和罗孚都是null。您从未创建过这样的对象。要创建它们,请执行Ford ford = new Ford();。顺便说一句,这与Java无关......

标签: java arrays object random


【解决方案1】:

假设yourList 是您的对象数组,请使用这一行:

Object randomObj = yourList[(int)Math.random() * list.length];

【讨论】:

  • 不必要的乘法和从 double 到 int 的转换。请改用Random 类。
  • @aioobe Math.random 不返回整数
【解决方案2】:

您可以通过使用Random class 来解决它。

String rndStr = yourArray[new Random().nextInt(yourArray.length)];

如果您需要重复执行此操作,您应该考虑将Random 作为成员变量,并在调用nextInt 时重用相同的实例。

【讨论】:

    【解决方案3】:

    您可以使用java.util.Random 的方法nextInt() 在数组中生成随机索引。该方法接受一个参数,指定返回的maximum - 1 值:指定数组的length

    // Member variables.
    Object[] arr = ...;
    Random r = new Random();
    
    Object nextRandmonObject()
    {
        return arr[r.nextInt(arr.length)];
    }
    

    【讨论】:

      【解决方案4】:

      很简单:

      Object your_array[];
      [...]
      Random rnd = new Random();
      Object random_element = your_array[rnd.nextInt(your_array.length)];
      

      【讨论】:

        【解决方案5】:

        喜欢这个

            String[] a = new String[]{"1","2","3","4"};
            Random rand = new Random();
            String arbit = a[rand.nextInt(a.length)];
        

        【讨论】:

          【解决方案6】:

          您可以让它们都实现相同的接口,然后随机选择该类。 一些非常未经检查的伪代码:

          public class  myclass1 implements RandomInterface {}
          
          
          public class  myclass2 implements RandomInterface {}
          
          public interface RandomInterface {
              public void doStuff1();
              pubilc String doStuff2();
          }
          
              public class random{
                  RandomInterface randomObj = yourList[(int)Math.random() * list.length];
                  randomObj.doStuff1();
                  randomObj.doStuff2();
          
              }
          

          【讨论】:

          • 哇,这么简单的问题太复杂了。
          • 因为他/她想在随机类上调用一个方法,我只能看到这是方法还是使用 instanceof 解决方案?
          • 哦,我想你误解了......“他/她想在随机类上调用一个方法”,他/她的意思是java.util.Random 类:) 我正在删除downvote ;)
          • 嘿嘿,有点不一样 =)
          【解决方案7】:

          你所有的对象都有一个返回值的函数,所以让它们实现这个接口:

          public interface ObjectReturningSomething
          {
              Object theFunction();
          }
          

          那么你的对象将是这样的类,函数返回不同类型的对象:

          public class ObjectReturningString implements ObjectReturningSomething
          {
              String theFunction() { return "Foo"; }
          }
          public class ObjectReturningInteger implements ObjectReturningSomething
          {
              Integer theFunction() { return 42; }
          }
          

          这是一个此类对象的数组:

          ObjectReturningSomething[] objectArray = new ObjectReturningSomething[] { new ObjectReturningString(), new ObjectReturningInteger() };
          

          这里是如何选择一个随机的:

          int randomIndex = new Random().nextInt(array.length);
          ObjectReturningSomething randomObject = objectArray.get(randomIndex);
          

          这是调用该函数的方法。

          System.out.println(randomObject.theFunction());
          

          【讨论】:

          • 过度复杂化。它是int randomIndex = new Random().nextInt(array.length);
          • nextInt(array.length) 确实更好,改进了。您认为哪一部分“过于复杂”?您的回答根本没有完全回答问题(它回答了如何从列表中选择一个随机对象,而不是如何在该对象上调用函数,这是问题的一部分)。
          猜你喜欢
          • 2015-11-10
          • 1970-01-01
          • 2021-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-21
          相关资源
          最近更新 更多