我在 Java 中复制了一个 C# 类。(我是 Java 新手。)
我的班级需要跟踪与双精度相关的 int 值。然后,只要一个值低于或高于双打,它就需要创建一个 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);
}
}