在Java中使用多个数据表单创建多维数组



我正在做一个项目,以帮助我回到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是一个接口而不是一个类。HashMapimplementsMap接口对应的类。

除了多维数组之外,还可以使用面向对象编程(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);
} 

相关内容

  • 没有找到相关文章

最新更新