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そのため、オブジェクトを作成する代わりにsetCurrentCapacity35.7439..パラメーターを使用してメソッドを呼び出す必要があります。私の目標は、

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

それだけです、とのMap間。したがって、エージェントアクティビティを再度再現する場合は、オブジェクトを処理するだけです。私は自分の目標を達成するための最良のアプローチは何でしょうか。たとえば、実際にオブジェクトを作成し、に保存する前にキャストする必要がありますか?関数呼び出しを設定するにはどうすればよいですか?つまり、オブジェクトを作成して、呼び出すように指示するにはどうすればよいですか?また、それはどういう意味で、次のような値をどのように処理できますか?Integer idObjectMapGencoObjectMapGencosetInOperationMap

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

$シンボルで?

4

2 に答える 2

0

ドル記号はクラス名に有効な文字ですが、慣例により使用しないことをお勧めします。実際には、さまざまな理由で表示される可能性があります。あなたのシナリオでLocalBrokerは、 の内部クラスである可能性がありDefaultBrokerServiceます。

JLS§3.8から:

「Java 文字」には、大文字と小文字の ASCII ラテン文字 AZ (\u0041-\u005a) と az (\u0061-\u007a) と、歴史的な理由から、ASCII アンダースコア (_、または \u005f) とドル記号が含まれます。 ($、または \u0024)。$ 文字は、機械的に生成されたソース コードでのみ使用するか、まれに、レガシー システムの既存の名前にアクセスするために使用する必要があります。

于 2012-08-27T02:30:43.963 に答える
0

私は自分の目標を達成するための最良のアプローチは何だろうと思っていました. たとえば、実際に Genco オブジェクトを作成し、マップに格納する前にオブジェクトにキャストする必要がありますか?

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 {
    }
}

2 つの .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 に答える