Java 中的关联数组


Associative arrays in Java

我来自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();
PHP 中的

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

.PHP:

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

爪哇岛:

Java 中的数组

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

Java 中的一维数组具有固定长度(无法更改(,每个键都是 0array.length - 1 范围内的整数。所以键,实际上称为索引,总是整数。此外,在Java中,如果你有一个数组,键24,你也有(至少(键013,因为长度必须至少为5。

Java 中的数组也只有一种类型,数组中的每个值只能是指定的类型。数组的大小和类型都无法更改。

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

  1. 显式指定创建数组时的长度

    String[] words = new String[4];
    

    变量 words 现在包含长度为 4 的 String 类型的数组。所有索引的值(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没有用于关联数组的内置语言结构,但它提供了与各种实现Map接口,例如 HashMap .Map具有键的类型以及值的类型。您可以使用这样的地图:

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;

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

爪哇中更可爱的方式

但是,似乎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 中执行此操作的更好方法。

无需创建 2D 数组,您可以创建 1 类汽车

   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

我建议熟悉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/

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

首先,您应该创建类 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());
}

似乎您要实现的是"汽车阵列"。因此,与其创建数组数组,我建议从字面上实现"汽车数组"。

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

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 

您可以使用更灵活的数据结构,如矢量、列表、地图等。搜索Java集合,你会发现信息的音调。

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的基础知识才能理解上面的代码。