2

我有一个文件,其中包含交易代理活动的输出。例如:

222666:org.powertac.common.Order::171875::new::21::165482::-35.74395569719625::35.0
222666:org.powertac.common.Order::171876::new::21::165893::-35.74395569719625::35.0

该类Order定义为:

  public Order (Broker broker, Timeslot timeslot,
                double mWh, Double limitPrice)
  {
    super();
    this.broker = broker;
    this.timeslot = timeslot;
    this.mWh = mWh;
    this.limitPrice = limitPrice;
  }

所以从我的文件中:

<id>:<package_name>::<execution_id>::<new object>::<args_list>

但是,有一些示例,例如:

222665:org.powertac.genco.Genco::21::setCurrentCapacity::35.74395569719625
222665:org.powertac.genco.Genco::21::setInOperation::true

new因此,我必须setCurrentCapacity使用参数调用该方法,而不是创建一个对象35.7439..。我的目标是创建一个

Map<Integer, Object> map = new Map<Integer, Object>();

就是这样,Map介于Integer id和之间Object。因此,如果我想再次重现代理活动,我只需处理Map对象。我想知道实现我的目标的最佳方法是什么。例如,我是否必须实际创建Genco对象并将其转换为,Object然后再存储到Map? 如何设置函数调用?我的意思是,我如何创建Genco对象并告诉它调用?另外,这是什么意思,我该如何处理以下值:setInOperationMap

300:org.powertac.du.DefaultBrokerService$LocalBroker::1::new::default broker
300:org.powertac.du.DefaultBrokerService$LocalBroker::1::setLocal::true

$符号?

4

2 回答 2

0

美元符号是类名中的有效字符,但按照惯例,不鼓励使用它。在实践中,它可能出于多种原因出现。在您的场景中,这很可能LocalBrokerDefaultBrokerService.

JLS§3.8

“Java 字母”包括大写和小写 ASCII 拉丁字母 AZ (\u0041-\u005a) 和 az (\u0061-\u007a),以及由于历史原因,ASCII 下划线(_ 或 \u005f)和美元符号($,或 \u0024)。$ 字符应仅用于机械生成的源代码中,或者很少用于访问遗留系统上预先存在的名称。

于 2012-08-27T02:30:43.963 回答
0

我想知道实现我的目标的最佳方法是什么。例如,我是否必须实际创建 Genco 对象,并将其转换为 Object,然后再存储到地图上?

Genco 已经是一个对象。你不需要投射它。Java中的所有类都继承自Object。只需将其插入地图即可。

yourMap.put( 1234, gencoObj );

我的意思是,如何创建 Genco 对象并告诉它在 Map 中调用 setInOperation?

通过其 id(您的地图键)获取对象,将其转换为适当的类型并调用所需的方法。

Object o = yourMap.get( 1234 );
if ( o instanceof Genco ) {
    Genco g = ( Genco ) o;
    g.methodToBeCalled();
}

Java 编译器使用该$符号来命名嵌套类。所以,在你的情况下,LocalBroker是一个嵌套类DefaultBrokerService.

编译这个:

public class Foo {
    private class Bar {
    }
}

将生成两个 .class 文件:Foo.classFoo$Bar.class.

编辑:要存储方法参数,您可以执行以下操作:

// considering this class
public class Genco {
    ...
    public void methodToBeCalled( Double param ) {
        // do something
    }
}


// in another class...
// storing the parameters using a String as a key
// representing the object id + the name of the method to be called
Map<String, Object[]> params = new HashMap<String, Object[]>();

// for methodToBeCalled of the object with id equals to 1234
// store a new array of objects with an 2.5 Double (autoboxing will apply here, i.e., 
// the double 2.5 will be wrapped in a Double
params.put( "1234-methodToBeCalled", new Object[]{ 2.5 } );


// now, using...
int objectId = 1234;

// get the object
Object o = yourMap.get( objectId );

// verify if it is an instance of Genco
if ( o instanceof Genco ) {

    // yes, it is, so cast it to Genco to be able
    // to call Genco specific methods
    Genco g = ( Genco ) o;

    // getting the parameters (objectId + method name)
    Object p = params.get( objectId + "-methodToBeCalled" );

    // calling the method, passing the first value of the stored array (2.5)
    g.methodToBeCalled( ( Double ) p[0] );

}
于 2012-08-27T02:31:12.107 回答