【问题标题】:Associative arrays in JavaJava中的关联数组
【发布时间】:2015-04-08 08:39:36
【问题描述】:

我来自 PHP 背景,我正在尝试创建一个多维数组,但很难理解 Java 的处理方式。我认为这可以使用 JSON 和 GSON 库来实现,但我无法理解这是如何完成的,因为我遵循了几个在线教程。

这就是我在 PHP 中所追求的,我怎样才能在 Java 中实现同样的目标?

function creatCars($id) {

    $aCars = array(
        0 => array(
                'name'  => 'vauxhall',
                'doors' => 5,
                'color' => 'black', 
        ),
        1 => array(
                'name'  => 'peogeot',
                'doors' => 3,
                'color' => 'red', 
        ),
    );

    return $aCars[$id];
}

function printFirstCarName($sName) {
    $aCar = createCars(0);
    echo $aCars['name'];
}

//prints "vauxhall"
printFirstCarName();

【问题讨论】:

  • Java 是一种强类型语言。可以创建异构数据结构,但这是一个复杂的过程。
  • @Jarrod,您通常在查找重复项方面做得很好;请不要破坏模式。

标签: java php associative-array


【解决方案1】:

Java 不是一种松散类型的语言,您必须告诉编译器每个变量将是什么。而要在 Java 中存储这种结构化数据,您应该首先声明一个类并实例化该类的对象。以下是您将如何实现与 PHP 代码相同的功能:

class Car {
    private String name, color;
    private int doors;

    Car(String name, int doors, String color) {
        this.name = name;
        this.doors = doors;
        this.color = color;
    }

    public String getName() {
        return this.name;
    }
}

public class CarMainClass {
    public static void main(String[] args) {
        Car[] aCars = new Car[2];

        aCars[0] = new Car("vauxhall", 5, "black");
        aCars[1] = new Car("peogeot", 3, "red");

        System.out.println("First car name is: " + aCars[0].getName());
    }
}

编译使用:

javac CarMainClass.java

然后运行:

java CarMainClass

你必须先学习 Java 的基础知识才能理解上面的代码。

【讨论】:

    【解决方案2】:

    看来您想要实现的是“汽车阵列”。因此,我建议不要创建一个数组数组,而是从字面上实现一个“汽车数组”。

    为此,我会先定义汽车,可能在不同的文件中:

    class Car {
      //you can make these private and use 'get' and 'set' methods instead
      public String name;
      public String color;
      public int doors;
    
      public Car() {
        name = "";
        color = "";
        doors = 0;
      }
    
      public Car(String name, String color, int doors) {
        this.name = name;
        this.color = color;
        this.doors = doors;
      }
    }
    

    您可以像这样在另一个模块中使用汽车结构:

    Car[] cars = new Car[100]; //create one hundred cars
    cars[11].doors = 4; //make the 12th car's number of doors to 4 
    

    您可以使用更灵活的数据结构,例如 Vectors、List、Maps 等...搜索 Java 集合,您会发现各种信息。

    【讨论】:

    • 类在没有方法并且所有字段都是公开的情况下没有多大意义。
    • 这段代码实际上会抛出 NullPointerException,因为所有数组元素最初都是 null
    • 我知道,我只想专注于方法:为汽车定义一个类型,然后使用集合。我会修改代码。
    • 另外,如果没有真正的行为,并且类型感觉更像是一种数据结构,那么我认为公共数据字段没有问题。
    【解决方案3】:

    您可以创建 1 个类 Car

    ,而不是创建 2D 数组
       public class Car{
        private String carName;
        private String color;
        private int noOfDoors;
    
        public car(String carName,int door,String color){
        this.carName=carName;
        this.door=door;
        this.color=color;
        }
        public String getCarName(){
        return getCarName;
        }
    
        public void setCarName(String carName){
        this.carName=carName;
        }
      // Same getters(getXXX) and setters(setXXX) for other Variables
     }
    

    现在创建上述类的对象

     Car audi=new Car("audi",2,"Black");
     Car bmw=new Car("bmw",4,"White");
    

    现在将这些添加到List<Cars>

    List<Car> listOfCars=new ArrayList<Car>();
    listOfCars.add(audi);
    listOfCars.add(bmw);
    

    现在打印第一辆车的名称

    Car firstCar=listOfCars.get(0);
    System.out.println(firstCar.getCarName()); //here getter Method Helped you
    

    【讨论】:

    • 无论谁对所有答案都投了这么快的票,请谨慎评论有一个很好的理由!!!
    • 这就像有人讨厌拖钓......不管选票如何,你的回答都很棒。感谢分享! :]
    • 我希望你得到你正在寻找的答案。!这就是这个社区的全部目的。
    【解决方案4】:

    我建议熟悉 HashMaps、Maps 和 ArrayLists。在 Java 和许多其他语言中,这类似于电子游戏作弊。

    private static Map<Integer, HashMap<String, String> > carMap = new HashMap<Integer, HashMap<String, String> >();
    

    但在这种情况下,您必须了解 OO 原则将如何帮助您。您可以使用 Car 对象创建一个类并填充 HashMap 等。

       class Car {
         private String name, colour;....
         public Car(){....}
         public void setValues(...){....}
    }
    

    为了更好地实现您想要的,我建议您阅读本文并熟悉一些设计模式。这条路有点远,但为 lulz 做这件事,看看那里有什么。示例:http://howtodoinjava.com/2012/10/23/implementing-factory-design-pattern-in-java/

    当从脚本转向强类型语言时,有时您也必须改变自己的思维方式。

    【讨论】:

      【解决方案5】:

      首先你应该创建类 Car 即:

      public class Car {
      
        enum ColorType {
           BLACK, RED;
        }
      
        private String name;
        private int doors;
        private ColorType color;
      
        Car(String name, int doors, ColorType color) {
          this.name = name;
          this.doors = doors;
          this.color = color;
        }
      
        public String getName() {
          return name;
        }
      
        public int getDoors() {
          return doors;
        }
      
        public ColorType getColor() {
          return color;
        }
      }
      

      现在你可以使用数组了,但更好的是使用 ArrayList:

      List<Car> cars = new ArrayList<Car>();
      cars.add(new Car("vauxhall", 5, BLACK));
      cars.add(new Car("peogeot", 3, RED));
      
      for (Car car : cars ) {
        System.out.println("Car name is: " + car.getName());
      }
      

      【讨论】:

        【解决方案6】:
        PHP 中的

        数组 与 Java 中的数组不同。以下是区别:

        PHP:

        PHP 数组实际上是字典。它们为每个键存储一个值,其中键可以是整数或字符串。如果您尝试使用其他东西作为键,它将被转换为整数或字符串。

        Java:

        Java 中的数组

        Java 数组的关联方式与 PHP 不同。让我们从 Java 中的一维数组开始:

        Java 中的一维数组有一个固定长度(不能更改)并且每个键都是一个整数,范围在0 到@987654322 @。所以键,实际上称为索引,总是整数。此外,在 Java 中,如果您有一个包含键 24 的数组,那么您还(至少)有键 013,因为长度必须至少为5 然后。

        Java 中的数组也只有一个类型,并且数组中的每个值只能是指定的类型。数组的大小和类型都不能改变。

        在 Java 中创建数组时,有两种可能:

        1. 创建数组时明确指定长度

          String[] words = new String[4];
          

          变量words 现在包含一个String 类型的数组,长度为4。所有索引(0 到3)的值最初设置为null

        2. 创建数组时指定元素

          String[] words = new String[] {"apple", "banana", "cranberry"};
          

          变量words 现在包含一个长度为3 的String 类型的数组。包含的元素与指定的第一个元素绑定到索引0,第二个元素绑定到索引1,依此类推。

        您可以将多维数组视为包含数组的数组。二维数组可能如下所示:

        String[][] twoD = new String[][] {
         {"apple", "banana", "cranberry"},
         {"car", "ship", "bicycle"}
        }
        

        对于这个twoD[0][2] 将是"cranberry"twoD[1][1] 将是"ship"。但是数组的维数不会影响键是整数这一事实。

        Java 中的地图:

        尽管 Java 没有用于关联数组的内置语言结构,但它提供了具有各种实现的接口 Map,例如HashMapMap 具有键的类型和值的类型。你可以像这样使用地图:

        HashMap<String, String> map = new HashMap<String, String>();
        map.put("car", "drive");
        map.put("boat", "swim");
        
        System.out.println("You can " + map.get("car") + " a car.");
        System.out.println("And a boat can " + map.get("boat") + ".");
        

        这将输出:

        You can drive a car.
        And a boat can swim.
        

        答案:

        Java 中的一对一方式

        您的问题的答案是,实际上不可能以合理的方式进行,因为您的某些值是字符串,而有些是整数。但这将是与您的 PHP 数组最相似的代码:

        //array of HashMaps which have Strings as key and value types
        HashMap<String, String>[] cars = new HashMap<String, String>[2];
        
        HashMap<String, String> first = new HashMap<String, String>();
        first.put("name", "vauxhall");
        first.put("doors", "5");
        first.put("color", "black");
        
        HashMap<String, String> second = new HashMap<String, String>();
        second.put("name", "peogeot");
        second.put("doors", "3");
        second.put("color", "red");
        
        //put those two maps into the array of maps
        cars[0] = first;
        cars[1] = second;
        

        这个解决方案不是很方便,但它是最接近给定数据结构的方式。

        Java 中更可爱的方式

        然而,您的 PHP 数组中的每个条目似乎都恰好具有三个属性:namedoorscolor。在这种情况下,您可能希望使用这些成员变量创建一个类Car,并将它们存储在一个数组中。这看起来像这样:

        public class Car {
        
            //member variables
            public String name;
            public int doors;
            public String color;
        
            //constructor
            public Car(String name, int doors, String color) {
                this.name = name;
                this.doors = doors;
                this.color = color;
            }
        
        }
        

        现在,当您拥有 Car 类时,您可以像这样创建一个包含所有汽车的数组:

        Car[] cars = new Car[2];
        cars[0] = new Car("vauxhall", 5, "black");
        cars[1] = new Car("peogeot", 3, "red");
        

        这是在 Java 中执行此操作的更好方法。

        【讨论】:

        • 请随时分享您投反对票的原因。它将帮助我改进答案。
        • 这很棒,“Java 中最可爱的方式”是我实现的方式。感谢您花时间分享两者 - 它让我有一个清晰的理解。 (不确定谁投反对票……所有答案都很棒,我都投了赞成票)
        猜你喜欢
        • 2015-11-03
        • 2011-07-04
        • 2011-09-22
        • 2012-06-07
        • 1970-01-01
        • 1970-01-01
        • 2012-04-05
        • 2011-11-28
        相关资源
        最近更新 更多