4

要素の値を変更できる動的な長さのデータ構造が必要です。要素の順序は重要ではありません。

  • 配列を使用すると、要素を変更できますが、長さに問題があります。解決策は、正しいサイズの新しい配列を作成し、毎回すべての要素を新しい配列にコピーすることです。要素の数は頻繁に変化するため、良いアイデアではありません。

  • ジェネリック リストを使用する方が良いですが、変更プロセスは非常に複雑です。まず、変更したい要素を削除する必要があります。ジェネリック リストには単純な「削除」/「削除」メソッドがないようです。だから私は「フィルター」を試してみました-次に、変更された要素を頭に追加しました。それは機能しますが、とても簡単なものには少し複雑すぎます。

長さを動的に変更し、変更可能なリストや動的サイズの配列などの要素を変更できるデータ構造はありますか?

4

2 に答える 2

7

ResizeArrayを使用します。これは CLI タイプList(T)の省略形であり、たとえば削除など、必要な機能を提供します。

MSDN ライブラリから:

List(T) クラスは、ArrayList クラスに相当する一般的なクラスです。必要に応じてサイズが動的に増加する配列を使用して、IList(T) ジェネリック インターフェイスを実装します。

Contains、IndexOf、LastIndexOf、 Removeなどのメソッドは、リスト要素に対して等値比較子を使用します。型 T のデフォルトの等値比較子は、次のように決定されます。型 T が IEquatable(T) ジェネリック インターフェイスを実装する場合、等値比較子はそのインターフェイスの Equals(T) メソッドです。それ以外の場合、デフォルトの等値比較子は Object.Equals(Object) です。

BinarySearch や Sort などのメソッドは、リスト要素の順序比較子を使用します。型 T のデフォルトの比較子は、次のように決定されます。型 T が IComparable(T) ジェネリック インターフェイスを実装する場合、既定の比較子はそのインターフェイスの CompareTo(T) メソッドです。それ以外の場合、型 T が非ジェネリック IComparable インターフェイスを実装する場合、既定の比較子はそのインターフェイスの CompareTo(Object) メソッドです。型 T がどちらのインターフェイスも実装しない場合、既定の比較子はなく、比較子または比較デリゲートを明示的に指定する必要があります。

List(T) はソートされるとは限りません。List(T) の並べ替えが必要な操作 (BinarySearch など) を実行する前に、List(T) を並べ替える必要があります。

このコレクションの要素には、整数インデックスを使用してアクセスできます。このコレクションのインデックスはゼロ ベースです。

List(T) は、参照型の有効な値として null 参照 (Visual Basic では Nothing) を受け入れ、要素の重複を許可します。

の例F#:

open System

// an integer list
let intList =
    let temp = new ResizeArray<int>() in
    temp.AddRange([| 1; 2; 3 |]);
    temp

// print each int using the ForEach member method
intList.ForEach( fun i -> Console.WriteLine(i) )

// unpack items from the resize array
let itemOne = intList.Item(0)
let itemTwo = intList.[1]
于 2012-06-11T11:00:11.550 に答える
5

ResizeArrayを使用することをお勧めします。基本的にSystem.Collections.Generic.List<'T>であり、要素の数が頻繁に変化する場合に使用するのに最適です。

// Add items to a ResizeArray based on a condition
let filterRange predicate (i, j) =
    let results = ResizeArray(j-i+1) // reserve enough memory
    for k = i to j do
        if predicate k then results.Add(k)
    results

2 番目の懸念については、引き続き構文arr.[idx] <- eを with として使用できますArray

の複雑な操作を避けるために、F# PowerPack のResizeArray モジュールResizeArrayで高次関数を使用できます。これらの関数は新しい を作成するため、パフォーマンスは理想的ではありません。ResizeArray

// Use high-order functions to update items
let changeOneToThree (a: ResizeArray<_>) =
   ResizeArray.map (fun x -> if x = 1 then 3 else x) a

ただし、いつでもそこから開始して、 current を変更することで最適化できますResizeArray

于 2012-06-11T11:01:05.583 に答える