java关联数组具有多种数据类型的事物

时间:2016-03-25 14:05:49

标签: java

想象一下: DataTypeForConfigs configString个密钥,但StringIntegerBoolean的值, 在Java中,JSON可以做到这一点,但我正在制作一种格式:

number "coolness" is 9001表示 int coolness = 9001;

它的方法是:读取行,读取每个单词,思考如何制作它,将其设置为变量范围内的变量

另外:如果另一件东西有自己放置配置的地方会发生什么?会读取null吗?为什么?构造函数认为文件上有null吗?愤怒的面孔。

说...我应该创建一个名为SettingVal的课程,当给出getValue()电话时它会说出它是什么?

SO:

config["Coolness"].getValue();

return的9001

WAIT:

我如何制作getValue()方法?怎么样?返回价值就像这样!! OH CRAP!

解决方案:

另一种数据类型进入并检查其“性别”(StringBoolInt),然后检查其“性别”的值({{1 }},strValboolVar

处理此问题时,返回值是一个大问题。我需要一个无压力版本,所以也许我可以有一个intVar返回方法,根据它所持有的数据类型运行另一种方法!我是对的吗?

我有一个临时解决方案,void有效,setVargetVar,其中*为get*VarStrBool。< / p>

可悲的是,我还没有能够从文件中正确读取它,我从文件中读取的方法不起作用。它使用Int构造函数生成Map<String,SettingVar>并返回该映射,但似乎每当我尝试从其中访问变量为HashMap的变量时。这可能是因为nullIOException s,FileNotFoundException?为什么?它应该在被调用之前运行。哦,还有FileNotFound s请帮忙!

SUBQUESTION:在for循环中多次NullPointerException会发生什么?怎么样MapVariable.put({NAME HERE}, varToPutIn)

我在链接中的代码:

https://gist.github.com/anonymous/66c4d1c2d2718a4cc9b9

因为我没有足够的声誉

P:好的!我已经让配置阅读器工作了,MapVariable.put({NAME HERE},new ...)SettingVar以及我正在处理SettingContainer这很好,现在正在研究像java这样的java命令提示符的原型,很快就会整个操作系统!!等待... java是一个操作系统。那就是为什么java虚拟机......哦。好吧,我怎么能关闭这个问题,把结果变成一个革命性的新东西,对于那些想要学习编写java *咳嗽咳嗽的孩子来说,特别是那些学习能力比社交能力高的人......并喜欢和成熟的人一起闲逛谁不像他们学校里的所有孩子一样欺负他们。 (哇,那是特定的)

4 个答案:

答案 0 :(得分:1)

我会使用一个可以从JSON读取的普通旧Java对象。

class Config {
    int coolness = 9001;
    String hello = "world";
    boolean cool = true;
}

通过这种方式,您可以拥有各种类型的字段。

答案 1 :(得分:0)

您正在寻找的类型是Map<String,Object>,但它不是类型安全的,您必须进行一堆投射:

Map<String,Object> config = new HashMap<>();
config.put("coolness",9001);
config.put("hello","world");
config.put("cool", true);

boolean cool     = (Boolean) config.get("cool");
String  hello    = (String)  config.get("world");
int     coolness = (Integer) config.get("coolness");

通常,我建议创建一个专用类来保存你的配置(每个字段=一个属性),它是强类型的,不需要强制转换,然后使用像Jackson那样从json序列化/反序列化它, yaml,或xml。

这为您的配置提供了结构,并且在您启动应用程序/加载配置时,而不是在应用程序的中间,将导致出现错误配置的任何问题。

答案 2 :(得分:0)

  

子提示:在for循环中多次MapVariable.put(varToPutIn)会发生什么?

地图代表一个映射。如果你这样做:

Map<String, Object> map = new HashMap<>();
for (int i = 0; i < 10; i++) {
    map.put("myKey", Integer.valueOf(i));
}

发生的事情是你从&#34; myKey&#34;添加映射。为零,然后将其更新为一,二,三等。当循环结束时,&#34; myKey&#34;将映射到九。

简而言之,&#34; myKey&#34;的地图条目表现形式类似于您重复分配的Integer类型的变量。

答案 3 :(得分:0)

我担心你的Gists告诉我你根本没有接受@Darth Android写的东西。而不是通过代码进行散列,这是解析配置文件语法(或多或少)并将其加载到Map<String, Object>

的简单方法

注意:我没有编译或测试此代码。它的写作是为了阅读和理解,而不是借用。

Map<String,Object> config = new HashMap<>();
try (Scanner s = new Scanner(new FileReader(someFile))) {
    while (s.hasNext()) {

        // Syntax is '<type> <name> is <value>'

        String[] words = s.nextLine().split("\\s+");
        if (words.length != 4 || !words[2].equals("is")) {
            throw MySyntaxException("unrecognizable config");
        }
        String type = words[0];
        String name = words[1];
        String val = words[3];
        switch (type) {
        case "number":
            map.put(name,  Integer.valueOf(val));
            break;
        case "boolean":
            map.put(name,  Boolean.valueOf(val));
            break;
        case "string":
            map.put(name, val);
            break;
        default:
            throw MySyntaxException("unknown type");
        }
    } catch (NumberFormatException ex) {
        throw MySyntaxException("invalid number");
    }
}