Java で C# クラスを複製しています。(私は Java の初心者です。)
私のクラスは、double に関連付けられた int 値を追跡する必要があります。次に、値が double を下回ったり上回ったりするたびに、Alerter(int) を作成する必要があります。
Alerter.LatencySensitiveAction() は、すぐに呼び出す必要があります。これは、遅延の影響を受けやすく、タイム クリティカルなコードです。DoubleMap クラスの目的は、LatencySensitiveAction() をできるだけ速く呼び出すことです。
DoubleMap.OnData() は、クラスの遅延に影響されやすいメソッドです (以下)。
TreeMap は理にかなっていますか? C# で SortedList を使用しています。キーと値のペアを高速トラバーサルでソートされた順序で格納する連想コレクションを探しています。
私はこのJavaコードと言われました
for (Map.Entry<Double,Alerter> entry : mAscend.entrySet() )
新しいオブジェクトを作成するため、効率的ではありません。代わりに何を使用すればよいですか?
したがって、基本的に、double と int を関連付けることができ、ソートされた順序で格納され、コレクションを順番にトラバースする最速の方法を使用するコレクションを尋ねています。
私の C# コード (以下) でうまくいくと思いますが、Java への変換には助けが必要です。私の C# コードも改善できると思われる場合は、教えてください.. ty.
Java コード:
public class DoubleMap {
TreeMap<Double,Alerter> mAscend, mDecend, mHoldAscend, mHoldDecend;
public DoubleMap()
{
mAscend = new TreeMap<Double, Alerter>();
mDecend = new TreeMap<Double, Alerter>(new ReverseComparator());
}
public void Add(boolean rAscend, double value, int size)
{
TreeMap<Double,TradeOrder> list = rAscend ? mAscend : mDecend;
Alerter to = list.get(value);
if ( to != null )
{
Alerter.size += size;
}
else
{
to = new Alerter (size);
list.put(value, to);
}
}
public void Remove(boolean rAscend, double value, int size)
{
TreeMap<Double,TradeOrder> list = rAscend ? mAscend : mDecend;
Alerter to = list.get(value);
if ( to != null )
{
long nsize = to.size - size;
if ( nsize <= 0 )
list.remove(value);
else
to.size = nsize;
}
}
public void Ondata(double rValue)
{
for (Map.Entry<Double,Alerter> entry : mAscend.entrySet() )
{
if ( entry.getKey() > rValue )
break;
entry.getValue().LatencySensitiveAction();
if ( mHoldAscend == null )
mHoldAscend = new TreeMap<Double,Alerter>(mHoldAscend);
mAscend.remove(entry.getKey());
}
for (Map.Entry<Double,TradeOrder> entry : mDecend.entrySet() )
{
if ( entry.getKey() < rValue )
break;
entry.getValue().LatencySensitiveAction();
if ( mHoldDecend == null )
mHoldDecend = new TreeMap<Double,TradeOrder>(mHoldDecend);
mHoldDecend.remove(entry.getKey());
}
if ( mHoldAscend != null )
{
mAscend = mHoldAscend;
mHoldAscend = null;
}
if ( mHoldDecend != null )
{
mDecend = mHoldDecend;
mHoldDecend = null;
}
}
}
C# コード:
public class DoubleMap
{
private SortedList<double, Alerter> mAscend, mDecend, mHoldAscend, mHoldDecend;
public DoubleMap()
{
mAscend = new SortedList<double, Alerter>();
mDecend = new SortedList<double, Alerter>(new DescendingComparer<double>());
}
public void Add(bool rAscend, double rValue, long rSize)
{
var list = rAscend ? mAscend : mDecend;
Alerter to;
if (list.TryGetValue(rValue, out to))
{
to.Size += rSize;
}
else
{
to = new Alerter(rSize);
list.Add(rValue, to);
}
}
public void Remove(bool rAscend, double rValue, long rSize)
{
var list = rAscend ? mAscend : mDecend;
Alerter to;
if (list.TryGetValue(rValue, out to))
{
long nqty = to.Size - rSize;
if (nqty <= 0)
{
list.Remove(rValue);
}
else
to.Size = nqty;
}
}
public void OnData(double rValue)
{
foreach (var pair in mAscend)
{
if (pair.Key > rValue)
break;
pair.Value.LatencySensitiveAction();
if (mHoldAscend == null)
mHoldAscend = new SortedList<double, Alerter>(mAscend);
mHoldAscend.Remove(pair.Key);
}
foreach (var pair in mDecend)
{
if (pair.Key < rValue)
break;
pair.Value.LatencySensitiveAction();
if (mHoldDecend == null)
mHoldDecend = new SortedList<double, Alerter>(mDecend, new DescendingComparer<double>());
mHoldDecend.Remove(pair.Key);
}
if (mHoldAscend != null)
{
mAscend = mHoldAscend;
mHoldAscend = null;
}
if (mHoldDecend != null)
{
mDecend = mHoldDecend;
mHoldDecend = null;
}
}
}
class DescendingComparer<T> : IComparer<T> where T : IComparable<T>
{
public int Compare(T x, T y)
{
return y.CompareTo(x);
}
}