在 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).

当然,这样的数组是非常弱类型的,没有什么可以阻止您向产品名称列添加双精度数,反之亦然。您还必须进行大量转换,这是一种代码味道。