【问题标题】:Printing gibberish for my map [duplicate]为我的地图打印乱码[重复]
【发布时间】:2015-04-23 23:31:54
【问题描述】:

所以我有一个将键作为触发器和值作为操作的映射。 Trigger 是一个内部类,它接受两个参数。 Action 也是一个接受三个参数的内部类。我有一个 addTransition 方法,它接受 5 个参数,前两个用于触发,后三个用于操作。在这种方法中,我添加了一个 system.out.println(map);但由于某种原因,它打印出这个:

{meta.TuringMachine$Trigger@7b3d091c=meta.TuringMachine$Action@ec636273}
{meta.TuringMachine$Trigger@7b3d091c=meta.TuringMachine$Action@ec636273, meta.TuringMachine$Trigger@7b3d08fe=meta.TuringMachine$Action@ec636273}
{meta.TuringMachine$Trigger@7b3d091c=meta.TuringMachine$Action@ec636273, meta.TuringMachine$Trigger@7b3d08fe=meta.TuringMachine$Action@ec636273, meta.TuringMachine$Trigger@7b3d0900=meta.TuringMachine$Action@ec636273}
{meta.TuringMachine$Trigger@7b3d091c=meta.TuringMachine$Action@ec636273, meta.TuringMachine$Trigger@7b3d08ff=meta.TuringMachine$Action@ec636273, meta.TuringMachine$Trigger@7b3d08fe=meta.TuringMachine$Action@ec636273, meta.TuringMachine$Trigger@7b3d0900=meta.TuringMachine$Action@ec636273}
{meta.TuringMachine$Trigger@7b3d091c=meta.TuringMachine$Action@ec636273, meta.TuringMachine$Trigger@7b3d08ff=meta.TuringMachine$Action@ec636273, meta.TuringMachine$Trigger@7b3d08fe=meta.TuringMachine$Action@ec636273, meta.TuringMachine$Trigger@7b3d0900=meta.TuringMachine$Action@ec636273}
{meta.TuringMachine$Trigger@7b3d091c=meta.TuringMachine$Action@ec636273, meta.TuringMachine$Trigger@7b3d08ff=meta.TuringMachine$Action@ec636273, meta.TuringMachine$Trigger@7b3d08fe=meta.TuringMachine$Action@ec636273, meta.TuringMachine$Trigger@7b3d0900=meta.TuringMachine$Action@ec636273, meta.TuringMachine$Trigger@7b3d0920=meta.TuringMachine$Action@ec636273}

编辑:我的 newBit 似乎不是空的。这也是我向地图添加值的方法:

public void addTransition(int curState, char curBit, int newState, char newBit, int direction){
           Trigger trigger = new Trigger(newState, newBit);
           Action action = new Action(newState, newBit, direction);
           program.put(trigger,action);
           System.out.println(program);
       }
TuringMachine a = new TuringMachine();
           a.addTransition(0,'1',0,'1',1);

由于某种原因,这是打印出来的

{(0, 49)=(0, , 0)}

【问题讨论】:

  • 这不是胡言乱语,这是老生常谈Object#toString()
  • 糟糕,以错误的副本关闭...等等...
  • 你可以尝试在 Action 和 Trigger 中重写 toString() 方法吗?
  • This 是一个更好的重复问题/答案。请注意,这个问题非常很常​​见。

标签: java hashmap


【解决方案1】:

您没有覆盖TriggerAction 中的toString() 方法,因此当您尝试从这些类之一打印对象时,它将改为调用Object.toString()

来自documentation

Object 类的 toString 方法返回一个字符串,该字符串由对象作为其实例的类的名称、at 符号字符“@”和对象哈希码的无符号十六进制表示形式组成。换句话说,这个方法返回一个字符串等于:

getClass().getName() + '@' + Integer.toHexString(hashCode())

你应该做的是这样的:

class Trigger {
    private int state;
    private char curBit;

    // rest of the code

    @Override
    public String toString() {
        return "(" + this.state + ", " + this.curBit + ")";
    }
}

【讨论】:

  • 因此,例如在我的 Trigger 类中,我有两个字段:int state、char curBit。我会做 public String toString(){ return state + curBit;}。但这是类型不匹配,因为我无法从 int 转换为 string
  • 对于触发器,它只打印出两个值。触发器类有 int newState, char newBit, int direction,我的 toString 方法是 return "(" + this.newState + "," + this.newBit + "," + this.direction+ ")";
  • @theProdigyLebron 你得到了什么输出?检查newBit 是否为空。
  • @theProdigyLebron 如果newBit(0, , 0) 中的中间值,则可能未设置。
  • 哦,我刚刚搞砸了我的构造函数。但由于某种原因,它打印出的值与预期的不同。我更新了我的问题
猜你喜欢
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 2020-07-12
相关资源
最近更新 更多