在 Java 中创建具有多种数据形式的多维数组
Creating multi dimensional arrays with multiple data forms in Java
我正在做一个项目来帮助我重新开始 Java 编码,它是一个基于文本的游戏(我知道,不多,但我必须从某个地方开始)。
无论如何,我遇到了一个问题。我需要能够将零件名称(这是一个硬件大亨游戏)和价格连同它们放入一个数组中。例如,台式电脑有 CPU 等部件,游戏会列出您的 CPU 选择。我需要一种存储这些数据的方法,这对我来说非常复杂,因为我不仅需要存储 CPU 的所有名称以供玩家使用,而且还需要将价格与名称一起存储。最重要的是,我有多种产品类型,例如台式机、笔记本电脑和游戏机,每种产品都有不同的零件名称和价格。
我想到了一个 3 维数组来存储产品类型,例如桌面(在列中)、部件名称(在行中)和价格(在行后面,如果这在 3 维方式中有意义的话。但我没有知道如何初始化这样的数组以及如何在初始化时设置值。
此外,我考虑过为每种产品类型创建 classes 并在每个 class 中放置数组来定义部件和价格(二维数组),但它仍然很复杂,我想知道如何对这些数据进行排序,并有可能制作一个系统,其中某些部分随着游戏时间的进行而被解锁。提前谢谢你。
我可能会带你走向不同的方向。为什么不创建 类 和对象?然后创建这些对象的实例? Java 是一种面向对象的语言。创建对象将允许您保存所需的所有值。快速示例,
Public abstract class CPU {
// Declare fields
private float price;
private String name;
// Declare constructors
}
Public class intelCPU extends CPU {
// GetPrice
public int getPrice() {
return price;
}
// Set Name
public void setName(n) {
name = n;
}
}
使用 Map
怎么样? Map
让我们以 Key
/Value
对的形式存储信息。您可以创建一个 Map
,它具有 key
类型的 String
(表示产品类型)和 value
类型的 Map
(表示单个产品) 有一个 String
key
(产品名称)和一个存储价格的值(可能是 double
)或信息(如 String
或其他)。这样你就可以做类似 outerMap.get("laptops").get("laptop1")
这样的事情 return laptop1 的信息。第一个 get
,获取包含所有笔记本电脑产品(或您想要的任何产品类型)的地图。第二个 return 是该类别中特定产品的信息。
你可以这样实现。
Map<String, Map<String, String>> productMap = new HashMap<>();
使用它,您可以放置这样的产品类型:
productMap.put("laptops", new HashMap<String,String>());
然后添加这样的产品:
productMap.get("laptops").put("laptop1","This is information about laptop 1");
PS:如果你不知道,我使用 = new HashMap
而不是 = new Map
的原因是因为 Map
不是 interface一个class。一个HashMap
是一个class,implements
一个Map
接口。
除了多维数组,您还可以使用面向对象编程 (OOP) 对其进行标记。根据您的描述,您似乎需要一个 class 层次结构,例如:
abstract class Product
class Desktop extends Product
class Laptop extends Product
class Console extends Product
将台式机、笔记本电脑、控制台等可以使用的所有通用 fields/methods 放入您的产品 class。
//Just an example
abstract class Product {
String name;
ArrayList<Component> components;
public String getName(){
return name;
}
}
由于每个产品都有多个组件,因此产品需要有一个组件列表,如上所示。
abstract class Component{
Double price;
public Double getPrice(){
return price;
}
}
现在您可以拥有 CPU、电源等组件,它们具有一些共同的行为和字段,例如放入组件 class 的价格。每个组件的任何特殊行为/字段都可以放入相应的 class 中,如下所示的时钟频率:
class CPU extends Component {
Double clockFreq;
}
因此,如果您的部件列表有 3 个项目,则可以像这样将其写入文本文件:
name,type,price
intelCPU6600,CPU,200
amdCPU7789,CPU,150
PS1Power,PSU,120
newPart,unknown,500
此列表可以包含 100 项,没有任何问题。使用 Scanner 将其读入您的程序中,并为每一行执行以下操作:
String line = scanner.nextLine();
String[] fields = line.split(",");
if("CPU".equals(fields[1]){
CPU cpu = new CPU(fields[0],fields[1],fields[2]);
//Product is an object of the class Product that you should have created earlier
product.components.add(cpu);
} else if("PSU".equals(fields[1]) {
PSU psu = new PSU(fields[0],fields[1],fields[2]);
product.components.add(psu);
} //..so on
如果您没有 class 通用产品,那么可以使用摘要 class:
if("unknown".equals(fields[1]){
Component comp = new Component(fields[0],fields[1],fields[2]);
product.components.add(comp);
}
我同意@Regis 的观点,您应该使用自定义对象来描述您的产品,然后将它们存储在某种数据结构中。
但是,您可以通过声明类型为 "Object," 的多维数组来解决您描述的问题,这将允许您基本上将任何东西放入其中,甚至是基元(自动装箱和自动拆箱已添加到 Java 5 并将在 int
等基本类型和该类型的 Java 包装器 class 之间无缝转换,如 java.lang.Integer
).
当然,这样的数组是非常弱类型的,没有什么可以阻止您向产品名称列添加双精度数,反之亦然。您还必须进行大量转换,这是一种代码味道。
我正在做一个项目来帮助我重新开始 Java 编码,它是一个基于文本的游戏(我知道,不多,但我必须从某个地方开始)。 无论如何,我遇到了一个问题。我需要能够将零件名称(这是一个硬件大亨游戏)和价格连同它们放入一个数组中。例如,台式电脑有 CPU 等部件,游戏会列出您的 CPU 选择。我需要一种存储这些数据的方法,这对我来说非常复杂,因为我不仅需要存储 CPU 的所有名称以供玩家使用,而且还需要将价格与名称一起存储。最重要的是,我有多种产品类型,例如台式机、笔记本电脑和游戏机,每种产品都有不同的零件名称和价格。 我想到了一个 3 维数组来存储产品类型,例如桌面(在列中)、部件名称(在行中)和价格(在行后面,如果这在 3 维方式中有意义的话。但我没有知道如何初始化这样的数组以及如何在初始化时设置值。
此外,我考虑过为每种产品类型创建 classes 并在每个 class 中放置数组来定义部件和价格(二维数组),但它仍然很复杂,我想知道如何对这些数据进行排序,并有可能制作一个系统,其中某些部分随着游戏时间的进行而被解锁。提前谢谢你。
我可能会带你走向不同的方向。为什么不创建 类 和对象?然后创建这些对象的实例? Java 是一种面向对象的语言。创建对象将允许您保存所需的所有值。快速示例,
Public abstract class CPU {
// Declare fields
private float price;
private String name;
// Declare constructors
}
Public class intelCPU extends CPU {
// GetPrice
public int getPrice() {
return price;
}
// Set Name
public void setName(n) {
name = n;
}
}
使用 Map
怎么样? Map
让我们以 Key
/Value
对的形式存储信息。您可以创建一个 Map
,它具有 key
类型的 String
(表示产品类型)和 value
类型的 Map
(表示单个产品) 有一个 String
key
(产品名称)和一个存储价格的值(可能是 double
)或信息(如 String
或其他)。这样你就可以做类似 outerMap.get("laptops").get("laptop1")
这样的事情 return laptop1 的信息。第一个 get
,获取包含所有笔记本电脑产品(或您想要的任何产品类型)的地图。第二个 return 是该类别中特定产品的信息。
你可以这样实现。
Map<String, Map<String, String>> productMap = new HashMap<>();
使用它,您可以放置这样的产品类型:
productMap.put("laptops", new HashMap<String,String>());
然后添加这样的产品:
productMap.get("laptops").put("laptop1","This is information about laptop 1");
PS:如果你不知道,我使用 = new HashMap
而不是 = new Map
的原因是因为 Map
不是 interface一个class。一个HashMap
是一个class,implements
一个Map
接口。
除了多维数组,您还可以使用面向对象编程 (OOP) 对其进行标记。根据您的描述,您似乎需要一个 class 层次结构,例如:
abstract class Product
class Desktop extends Product
class Laptop extends Product
class Console extends Product
将台式机、笔记本电脑、控制台等可以使用的所有通用 fields/methods 放入您的产品 class。
//Just an example
abstract class Product {
String name;
ArrayList<Component> components;
public String getName(){
return name;
}
}
由于每个产品都有多个组件,因此产品需要有一个组件列表,如上所示。
abstract class Component{
Double price;
public Double getPrice(){
return price;
}
}
现在您可以拥有 CPU、电源等组件,它们具有一些共同的行为和字段,例如放入组件 class 的价格。每个组件的任何特殊行为/字段都可以放入相应的 class 中,如下所示的时钟频率:
class CPU extends Component {
Double clockFreq;
}
因此,如果您的部件列表有 3 个项目,则可以像这样将其写入文本文件:
name,type,price
intelCPU6600,CPU,200
amdCPU7789,CPU,150
PS1Power,PSU,120
newPart,unknown,500
此列表可以包含 100 项,没有任何问题。使用 Scanner 将其读入您的程序中,并为每一行执行以下操作:
String line = scanner.nextLine();
String[] fields = line.split(",");
if("CPU".equals(fields[1]){
CPU cpu = new CPU(fields[0],fields[1],fields[2]);
//Product is an object of the class Product that you should have created earlier
product.components.add(cpu);
} else if("PSU".equals(fields[1]) {
PSU psu = new PSU(fields[0],fields[1],fields[2]);
product.components.add(psu);
} //..so on
如果您没有 class 通用产品,那么可以使用摘要 class:
if("unknown".equals(fields[1]){
Component comp = new Component(fields[0],fields[1],fields[2]);
product.components.add(comp);
}
我同意@Regis 的观点,您应该使用自定义对象来描述您的产品,然后将它们存储在某种数据结构中。
但是,您可以通过声明类型为 "Object," 的多维数组来解决您描述的问题,这将允许您基本上将任何东西放入其中,甚至是基元(自动装箱和自动拆箱已添加到 Java 5 并将在 int
等基本类型和该类型的 Java 包装器 class 之间无缝转换,如 java.lang.Integer
).
当然,这样的数组是非常弱类型的,没有什么可以阻止您向产品名称列添加双精度数,反之亦然。您还必须进行大量转换,这是一种代码味道。