Я реплицирую класс C # на Java. (Я новичок в Java.)
Мой класс должен отслеживать значения типа int, связанные с double. Затем он должен создать Alerter (int) всякий раз, когда значение пересекается ниже или выше двойных.
Alerter.LatencySensitiveAction (), должен вызываться немедленно, он чувствителен к задержке и критичен по времени. Цель класса DoubleMap - вызвать LatencySensitiveAction () как можно быстрее.
DoubleMap.OnData () - чувствительный к задержке метод класса (ниже).
Имеет ли смысл TreeMap? Я использую SortedList в C #. Я ищу ассоциативную коллекцию, которая хранит пары ключ / значение в отсортированном порядке с быстрым обходом.
Мне сказали, что этот код Java
for (Map.Entry<Double,Alerter> entry : mAscend.entrySet() )
неэффективен, потому что он создает новый объект. Что я должен использовать вместо этого?
Итак, в основном, я спрашиваю, какую коллекцию использовать, которая может ассоциировать double и int, хранится в отсортированном порядке, и какой самый быстрый способ пройти по коллекции в порядке.
Я полагаю, что мой код C # (ниже) делает свою работу, и мне нужна помощь с его преобразованием в Java. Если вы думаете, что мой код C # тоже можно улучшить .. пожалуйста, скажите .. ты.
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);
}
}