【问题标题】:read java.util.Map<String,?> from a file从文件中读取 java.util.Map<String,?>
【发布时间】:2015-04-10 17:58:58
【问题描述】:

我在从保存到首选项文件的地图中获取值时遇到问题。我可以打印出地图中的键,但不能打印任何值。我认为这与我正在做的类型转换有关,但我已经尝试了我所知道的一切,但无法弄清楚。

我测试了我保存到首选项文件的地图中的值,它们的输出很好。

我尝试了以下建议,但没有帮助

这是我的代码

public class SetSettings {
private Actor actor;
private Actor hit;
private Sprite sprite;
private Sprite sprite2;
private Rectangle rect;
private boolean customHit = false;
private ShapeRenderer render = new ShapeRenderer();
public float y;
public float x;
Array<Actor> actors = GameScreen.buttons.stage.getActors();

public SetSettings() {
    setOriginal();
    setCustom();
    rect = new Rectangle();
}

public void setOriginal() {
    learnGame.ass.settings.get().clear();
    float height = Gdx.graphics.getHeight();
    float width = Gdx.graphics.getWidth();
    // ui settings
    java.util.Map<String, Coords> map = new HashMap<String, Coords>();
    map.put("hpBar", new Coords(width - (learnGame.ass.hpBar.getWidth() * 1.02f), height - (height * .076f)));
    map.put("hpBase", new Coords(learnGame.ass.hpBar.getX(), learnGame.ass.hpBar.getY()));

    for (Entry<String, Coords> key : map.entrySet())
        System.out.println(key.getValue().x); // works fine here

}

public void setCustom() {
    java.util.Map<String, Coords> amap = (java.util.HashMap<String, Coords>) learnGame.ass.settings.get();
    // Float[] nums = amap.get("hpBar");
    for (Entry<String, Coords> key : amap.entrySet()) {
        // /float t = key.getValue().x; // <-----------error here -- java.lang.String cannot be cast
        System.out.println("6" + key.getKey());
        // String xz = key.getValue();
    }

}

public class Coords {
    float x;
    float y;

    public Coords(float x, float y) {
        this.x = x;
        this.y = y;
    }
}

}

【问题讨论】:

  • learnGame 在哪里声明? learnGame.ass.settings的类型是什么?
  • 其类型为 Preferences

标签: java android dictionary libgdx


【解决方案1】:

您应该像here 给出的示例一样从共享首选项中保存/加载

//persist
HashMap<String, Integer> counters; //the hashmap you want to save
SharedPreferences pref = getContext().getSharedPreferences("Your_Shared_Prefs", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();    
for (String s : counters.keySet()) {
    editor.putInteger(s, counters.get(s));
}
editor.commit();


//load
SharedPreferences pref = getContext().getSharedPreferences("Your_Shared_Prefs", Context.MODE_PRIVATE);
HashMap<String, Integer> map= (HashMap<String, Integer>) pref.getAll();
for (String s : map.keySet()) {
        Integer value=map.get(s);
        //Use Value
}

您需要查看您在 Coords 中使用的方法的返回值,并使用适当类型的变量来存储这些返回值。

这样的事情应该没问题:

 for (Entry<String, Coords> key : amap.entrySet()) {
       float x_value = key.getValue().getX(); 
       float y_value = key.getValue().getY(); 
    }

使用吸气剂应该可以正常工作:

public class Coords {
    float x;
    float y;

    public Coords(float x, float y) {
        this.x = x;
        this.y = y;
    }
     public float getX(){
       return this.x;
      }
     public float getY(){
       return this.y;
      }
}

【讨论】:

  • learnGame.ass.settings.get();实际上是 Map 因为这是类型首选项的设置将返回的唯一内容。我的值仍然返回为 java.lang.String's
  • 查看更新的答案,希望示例 + 链接能帮助您更好地理解保存/加载,我知道前段时间有人帮助了我
  • 是的,这是有道理的,遗憾的是我正在使用 libgdx libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/…
【解决方案2】:

你的问题在这里:

java.util.Map<String, Coords> amap = (java.util.HashMap<String, Coords>) learnGame.ass.settings.get();

您不能只将Map&lt;String, ?&gt; 转换为HashMap&lt;String, Coords&gt;!这不是 TypeSafe!

试试这样的:

Map<String, ?> settings = learnGame.ass.settings.get();
for (Entry<String, ?> entry : settings.entrySet()) {
    if (entry.getValue() instanceof Coords) {
        Coords coords = (Coords) entry.getValue();
        // do some with coords
    }
}

【讨论】:

  • 当我尝试这个时,我所有的值仍然被视为字符串。 --->entry.getValue() 是 String 的一个实例
【解决方案3】:

你要做的是:

float t = Float.parseFloat(theString);

您还应该收到"NumberFormatException"

【讨论】:

  • 这对我不起作用,因为我需要从 "theString" 获得 2 个浮点数
  • 你能解释一下 Coords.x 的类型是什么吗?
  • 它是一个浮点数,但“theSring”的类型是 Coords,其中包含 x 和 y..无论如何我问了另一个问题,发现 Libgdx 首选项不接受数组或对象集合
猜你喜欢
  • 1970-01-01
  • 2017-05-01
  • 2016-08-25
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-15
  • 2011-03-08
相关资源
最近更新 更多