2013-06-14 3 views
2

У меня есть процентные значения в карте с флагами, как- [44,4: правда, 0,0: ложь, 44,4: ложь, 38,9: ложь, ложь 0,0]Groovy/Java карта сортировать

Я хочу, чтобы отсортировать их в в порядке убывания. Код, который я использую, теряет дубликаты ключей. Я не хочу их потерять, так как я хочу отображать все значения в выходе.

def secDisc = [:] 
def discount = plan."${section}" 
if(plan."${section}"!=null && plan.bluePlan) 
secDisc."$discount" = true 
else if(plan."${section}"!=null && !plan.bluePlan) 
secDisc."$discount" = false 
secDisc = secDisc.sort {a, b -> b.key <=> a.key} 
secDisc.each{disc, flag-> 

     println "disc- $disc flag- $flag" 
} 

Когда я печатаю его, остается только одно значение 0.0. Спасибо!

+0

Странно, что вы смогли перенести повторяющиеся значения на карту в первую очередь (если хранилище резервных копий действительно является «Картой») - или вы можете использовать «IdentityHashMap»? Не знаете, как вы это делаете в Groovy. – fge

+2

Возможно, вы захотите переосмыслить использование десятичных знаков в качестве ключей к карте. –

ответ

3

Я бы переосмыслил вид структуры данных, которую вы используете. У вас есть значение, которое является булевым, но вы пытаетесь поместить несколько одинаковых ключей в карту. Это не будет работать.

Вместо этого, я бы попытаться сделать значение от списка булевых, поэтому ваш пример становится:

[44.4: [true, false], 0.0: [false, false], 38.9: [false]] 

Это будет гарантировать, что ключи дублирующих никогда не теряется. Кроме того, сортировка будет проще. Кроме того, как упоминал @tim_yates, я бы преобразовал ваши ключи в строки с фиксированным числом десятичных знаков, чтобы математика с плавающей запятой не выдавала значения, которые слегка отступают в 12-й десятичной цифре.

Вы не указали, что сортировка важна для идентичных ключей с разными значениями.

+0

Спасибо. Я не могу делать строки ключей, потому что сортировка их в порядке убывания после заполнения карты на этом этапе - secDisc = secDisc.sort {a, b -> b.key <=> a.key}. Заказ идентичных ключей с разными значениями не имеет значения. – Maryam

+0

Я все еще был бы осторожен в отношении математических заметок с плавающей запятой. Если вы не можете делать строки, но знаете, сколько значащих цифр есть, я бы рассмотрел возможность умножения на 10^2 (или сколько бы десятичных цифр вам не нужно) и вместо этого использовать целые числа. –