我正在做一个项目,以帮助我回到Java编码,这是一个基于文本的游戏(我知道,不多,但我必须开始某处)。总之,我遇到了一个问题。我需要能够将部件的名称(这是一款硬件大亨游戏)和价格连同它们一起放入数组中。例如,台式电脑有CPU之类的部件,游戏会列出你的CPU选择。我需要一种存储这些数据的方法,这对我来说非常复杂,因为我不仅需要为玩家存储所有cpu的名称,还需要在名称旁边存储价格。最重要的是,我有多种产品类型,如台式机、笔记本电脑和控制台,每种产品都有不同的部件名称和价格。我想到了一个三维数组来存储产品类型,比如桌面(列中)、部件名称(行中)和价格(在行后,如果这在三维方式中有意义的话)。但是我不知道如何初始化这样一个数组,以及如何在初始化时设置值。
此外,我想为每种产品类型创建类,并在每个类中放入数组来定义部件和价格(2d数组),但它仍然很复杂,我想知道如何对这些数据进行排序,并有可能制作一个系统,其中某些部件可以随着游戏时间的进展而解锁。
我可能会带你去另一个方向。为什么不创建类和对象呢?然后创建这些对象的实例?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;
}
}
我同意@Regis的观点,你应该使用一个自定义对象来描述你的产品,然后将它们存储在某种数据结构中。
然而,你可以通过声明一个"Object"类型的多维数组来解决你所描述的问题,这将允许你基本上把任何东西放入其中,甚至是原语(自动装箱和自动装箱是在Java 5中添加的,可以在原语类型(如int
)和该类型的Java包装类(如java.lang.Integer
)之间无缝转换)。
当然,这样的数组将是非常弱类型的,并且没有什么可以阻止您向产品名列添加双精度,反之亦然。您还必须进行大量的类型转换,这是一种代码气味。
如何使用Map
代替。Map
允许您将信息存储在Key
/Value
对中。你可以创建一个Map
,它具有key
类型的String
(代表产品类型)和value
类型的Map
(代表单个产品),它具有String
key
(产品名称)和存储价格(可能是double
)或信息(作为String
或其他东西)的值。这样您就可以执行outerMap.get("laptops").get("laptop1")
之类的操作,它将返回laptop1的信息。第一个get
获取包含所有笔记本电脑产品(或您想要的任何产品类型)的Map。第二个返回该类别中特定产品的信息。
你可以这样实现。
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
是一个接口而不是一个类。HashMap
是implements
和Map
接口对应的类。
除了多维数组之外,还可以使用面向对象编程(OOP)对其进行标记。从您的描述来看,您需要一个类层次结构,类似于:
abstract class Product
class Desktop extends Product
class Laptop extends Product
class Console extends Product
把所有可以被Desktop, Laptop, Console等使用的常用字段/方法放到你的Product类中。
//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,电源等,他们有一些共同的行为和字段,如放入Component类的价格。每个组件的任何特殊行为/字段都可以放入相应的类中,如时钟频率:
class CPU extends Component {
Double clockFreq;
}
所以如果你的零件列表有3个项目长,它可以写在一个文本文件中,像这样:
name,type,price
intelCPU6600,CPU,200
amdCPU7789,CPU,150
PS1Power,PSU,120
newPart,unknown,500
这个列表可以有100个项目,没有任何问题。使用扫描器将其读入程序中。对每一行执行如下操作:
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
如果有一个通用产品,你没有类,那么抽象类可以使用:
if("unknown".equals(fields[1]){
Component comp = new Component(fields[0],fields[1],fields[2]);
product.components.add(comp);
}