2010-12-19 3 views
8

C++のデータ構造をScalaに変換する際に問題があります。 ScalaはC++とはまったく異なりますが、私はそれが大好きです。 は、私はC++で次のコードを持っている:C++プログラマ(structsとstl)のScalaに関する質問

struct Output 
{ 
    double point; 
    double solution[6]; 
}; 

struct Coeff 
{ 
    double rcont1[6]; 
    double rcont2[6]; 
    double rcont3[6]; 
    double rcont4[6]; 
    double rcont5[6]; 
    double rcont6[6]; 
}; 
std::list<Output> output; 
std::list<Coeff> coeff; 

私は今、私はデータを保持するためにScalaで単純なクラスを作成しようとしたデータ

while(n<nmax) { 
    if step successfull 
     Output out; 
     out.point = some values; 
     out.solution[0] = some value; 
     output.push_back(out); 
} 

とwhileループでリストを埋めます。

class Output 
{ 
    var point: Double 
    var solution: Array[Double] = new Array(6) 
} 

しかし、これはポイントが初期化されていないため動作しません。これを回避する方法はありますか?私は変数を定義したいが、初期化はしたくない。

もうひとつ素早いものです。私はstl :: lower_boundに相当するものを探しています。

Isは、順序を維持するためにソートされたコンテナに要素を挿入する正しい位置を見つけます。

誰もが持っている:-)に慣れる

class Output 
{ 
    var point: Double = _ 
    var solution: Array[Double] = Array(6) 
} 

PUH Scalaはsyntxをたくさん持っている:Scalaの初心者を助けるため

おかげで

+0

私はあなたが 'std :: lower_bound '。何が必要だと思いますか? –

+0

'Seq.indexWhere'が可能性があります。 – Debilski

+0

私はリストを持っていますval list = List(1.0、2.0、3.0、4.0)は、区間を表します。私は今、ポイント2.5を持っており、それがどんな間隔(2.0と3.0の間)であるかを知る必要があります。インデックスをありがとう私はそれを試してみよう。 – Radfahrer

答えて

3

私はちょうどintialistionへの答えを見つけました同等のlower_boundのソリューションですか?

3

それはあなたの擬似コードの後ろに隠れ未知数の多くを残してきたように、効果的に翻訳することは難しいですが、私はこれらの線に沿って何かを提唱したい:あなたはあなたのサンプルコードAを肉付けすることができた場合

// type alias 
type Coeff = Seq[Seq[Double]] 

// parameters passed to a case class become member fields 
case class Output (point: Double, solution: Seq[Double]) 

val outputs = (0 to nmax) map { n => 
    Output(generatePoint(n), generateSolution(n)) 
} 

をもう少し完全に、私はより良い翻訳を与えることができるでしょう。

+0

これは面白そうです(私はまだ関数型プログラミングには慣れていません)。ここには完全なC++コードhttp://paste.pocoo.org/show/307014/があります。興味深い部分はフォームラインです224-251 – Radfahrer

4

なぜ初期化しませんか?効率のために?私は、JVMが、元々あったものに基づいて、あなたの変数にランダムな迷惑メールを持つことを免れないことを恐れています。とにかくそれを初期化しなければならないので、あなたの「初期化されていない」値が何であるかを指定してみませんか?

class Output { 
    var point = 0.0 
    var solution = new Array[Double](6) 
} 

(後で値が初期化されているかどうかを確認する必要がある場合は、Double.NaNを使用してpoint.isNaNをチェックすることができます。)

あなたはデフォルトの初期化として_を使用することができますが、あなたがそれを使用しない限り、

class Holder[T] { 
    var held: T = _ 
} 

あなたは値が本当に設定されることを隠すだけです。 (あるいは、「ここに何が入っているかは気にしません。役に立つかもしれません。」

+0

よく習慣から外れています:-)これらのオプションに感謝します。 NaNが初期化されているかどうかを確認できるようにします – Radfahrer

関連する問題