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();
Java 不是一种松散类型的语言,您必须告诉编译器每个变量将是什么。而要在Java中存储这种结构化数据,你应该首先声明一个class并实例化那个class的对象。以下是如何实现与 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 的基础知识才能理解上面的代码。
看来您要达到的目标是 'array of cars'。因此,我建议不要创建数组数组,而是直接实现 'array of cars'.
为此,我会先定义汽车,可能在不同的文件中:
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、Map 等...搜索 Java 个集合,您会找到各种信息。
您可以创建 1 class 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
}
现在创建上面的对象class
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 对象创建 class 并填充 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/
从脚本语言转向强类型语言时,有时您也必须改变思维方式。
首先你应该创建 class 汽车即:
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());
}
PHP 中的数组 与 Java 中的数组不同。以下是不同之处:
PHP:
PHP数组其实就是字典。它们为每个键存储一个值,其中键可以是整数或字符串。如果您尝试使用其他内容作为键,它将被转换为整数或字符串。
Java:
Java
中的数组
Java 数组的关联方式与它们在 PHP 中的关联方式不同。让我们从 Java:
中的一维数组开始
Java中的一维数组具有固定长度(无法更改)并且每个键都是一个整数 在 0
到 array.length - 1
的范围内。所以键,实际上称为索引,总是整数。此外,在 Java 中,如果您有一个包含键 2
和 4
的数组,您还(至少)具有键 0
、1
和3
,因为长度必须至少为5。
Java中的数组也只有一个类型并且数组中的每个值只能是指定的类型。数组的大小和类型都不能更改。
当您在 Java 中创建数组时,您有两种可能性:
创建数组时明确指定长度
String[] words = new String[4];
变量words
现在持有一个长度为4的String
类型的数组。所有索引(0到3)的值初始设置为null
.
创建数组时指定元素
String[] words = new String[] {"apple", "banana", "cranberry"};
变量words
现在包含一个String
类型的数组,长度为3。包含的元素与指定的第一个元素绑定到索引0,第二个元素绑定到索引1,等等。
您可以将多维数组想象成一个包含数组的数组。二维数组可能如下所示:
String[][] twoD = new String[][] {
{"apple", "banana", "cranberry"},
{"car", "ship", "bicycle"}
}
为此 twoD[0][2]
将是 "cranberry"
,而 twoD[1][1]
将是 "ship"
。但是数组的维数并不影响键是整数这一事实。
Java 中的地图:
尽管 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;
这个解决方案不是很方便,但它是最接近给定数据结构的方法。
Java
中更可爱的方式
然而,您的 PHP 数组中的每个条目似乎都恰好具有三个属性:name
、doors
和 color
。在这种情况下,您可能希望使用这些成员变量创建一个 class 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;
}
}
现在,当您拥有 class Car
时,您可以像这样创建一个包含所有汽车的数组:
Car[] cars = new Car[2];
cars[0] = new Car("vauxhall", 5, "black");
cars[1] = new Car("peogeot", 3, "red");
这是在 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();
Java 不是一种松散类型的语言,您必须告诉编译器每个变量将是什么。而要在Java中存储这种结构化数据,你应该首先声明一个class并实例化那个class的对象。以下是如何实现与 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 的基础知识才能理解上面的代码。
看来您要达到的目标是 'array of cars'。因此,我建议不要创建数组数组,而是直接实现 'array of cars'.
为此,我会先定义汽车,可能在不同的文件中:
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、Map 等...搜索 Java 个集合,您会找到各种信息。
您可以创建 1 class 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
}
现在创建上面的对象class
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 对象创建 class 并填充 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/
从脚本语言转向强类型语言时,有时您也必须改变思维方式。
首先你应该创建 class 汽车即:
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());
}
PHP 中的数组 与 Java 中的数组不同。以下是不同之处:
PHP:
PHP数组其实就是字典。它们为每个键存储一个值,其中键可以是整数或字符串。如果您尝试使用其他内容作为键,它将被转换为整数或字符串。
Java:
Java
中的数组Java 数组的关联方式与它们在 PHP 中的关联方式不同。让我们从 Java:
中的一维数组开始Java中的一维数组具有固定长度(无法更改)并且每个键都是一个整数 在 0
到 array.length - 1
的范围内。所以键,实际上称为索引,总是整数。此外,在 Java 中,如果您有一个包含键 2
和 4
的数组,您还(至少)具有键 0
、1
和3
,因为长度必须至少为5。
Java中的数组也只有一个类型并且数组中的每个值只能是指定的类型。数组的大小和类型都不能更改。
当您在 Java 中创建数组时,您有两种可能性:
创建数组时明确指定长度
String[] words = new String[4];
变量
words
现在持有一个长度为4的String
类型的数组。所有索引(0到3)的值初始设置为null
.创建数组时指定元素
String[] words = new String[] {"apple", "banana", "cranberry"};
变量
words
现在包含一个String
类型的数组,长度为3。包含的元素与指定的第一个元素绑定到索引0,第二个元素绑定到索引1,等等。
您可以将多维数组想象成一个包含数组的数组。二维数组可能如下所示:
String[][] twoD = new String[][] {
{"apple", "banana", "cranberry"},
{"car", "ship", "bicycle"}
}
为此 twoD[0][2]
将是 "cranberry"
,而 twoD[1][1]
将是 "ship"
。但是数组的维数并不影响键是整数这一事实。
Java 中的地图:
尽管 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;
这个解决方案不是很方便,但它是最接近给定数据结构的方法。
Java
中更可爱的方式然而,您的 PHP 数组中的每个条目似乎都恰好具有三个属性:name
、doors
和 color
。在这种情况下,您可能希望使用这些成员变量创建一个 class 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;
}
}
现在,当您拥有 class Car
时,您可以像这样创建一个包含所有汽车的数组:
Car[] cars = new Car[2];
cars[0] = new Car("vauxhall", 5, "black");
cars[1] = new Car("peogeot", 3, "red");
这是在 Java 中执行此操作的更好方法。