Отсутствующая пара значений ключа в древовидной карте - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь решить проблему программирования с помощью TreeMap, что привело меня к публикации этого вопроса.

Я определил treeMap с (Int, Int) в качестве ключа и String в качестве значения,определили упорядочение treeMap на основе первого элемента кортежа.и я вставил два элемента разных Key, но окончательный treeMap содержит только один элемент. Это определенное поведение treeMap

Scala Code: (Версия: 2.12.3)

val a = scala.collection.mutable.TreeMap[(Int, Int), String]()(Ordering.by(x => x._1))
a.put((9, 21), "value-1")
a.put((9, 10), "value-2")
println(a.size) // 1

Я пробовал ту же реализацию в Java, но он сообщает о размере карты, как 2 вот мой код Java:

Может кто-нибудь предложить, если я что-то упускаю

import java.util.Comparator;
import java.util.TreeMap;

public class JavaTreeMapTest {

    public static void main(String[] args) {

        class Tuple {
            Integer a;
            Integer b;

            public Tuple(Integer a, Integer b) {
                this.a = a;
                this.b = b;
            }

        }
        Comparator<Tuple> testComparator = new Comparator<Tuple>() {

            @Override
            public int compare(Tuple arg0, Tuple arg1) {
                if (arg0.a > arg1.a) {
                    return arg0.a;
                } else
                    return arg1.a;
            }

        };

        TreeMap<Tuple, String> tm = new TreeMap<Tuple, String>(testComparator);
        tm.put(new Tuple(100, 100), "value-1");
        tm.put(new Tuple(100, 101), "value-2");

        System.out.println(tm.size()); //2

    }
}

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Чтобы дать точный ответ, я бы сказал, что, в отличие от Java TreeMap, scala.collection.mutable.TreeMap использует предоставленный Ordering для определения равенства, а не ==.Это имеет некоторые другие интересные последствия.Используя a из вашего вопроса:

a.contains((9, 0)) // true
a((9, -1000)) // "value-2"

Действительно, у Ordering есть метод equiv для определения, равны ли две вещи в порядке.Хотя этот метод не используется в реализации TreeMap , он демонстрирует философию полагаться на Ordering в качестве источника истины, а не на менее гибкий ==.

0 голосов
/ 09 февраля 2019

Проблема с вашим заказом.Если вы используете это так: Ordering.by(x => x._1), TreeMap будет рассматривать только первый элемент для вычисления равенства.Итак, и (9, 21), и (9, 21) будут считаться равными.

Одним из решений будет порядок сначала по первому элементу, а затем по второму.Вы можете сделать это, вернув кортеж: Ordering.by(x => (x._1, x._2)).

Но так как вы уже используете кортежи, вы можете упростить его до:

Ordering.by(x => x)

или

Ordering.by(identity)

или

Вы можете опуститьэто потому, что упорядочение по идентичности является значением по умолчанию.

В заключение:

val a = scala.collection.mutable.TreeMap[(Int, Int), String]()
a.put((9, 21), "value-1")
a.put((9, 10), "value-2")
println(a.size) // 2
...