Общий класс пары - PullRequest
       43

Общий класс пары

11 голосов
/ 18 мая 2011

Просто пытаясь ответить на этот вопрос, я нашел в прошлом экзаменационном листе, чтобы я мог подготовиться к предстоящему экзамену по Java.

Предоставление универсального класса Pair для представления пар вещей. Класс должен предоставлять конструктор, метод для получения первого члена пары, метод для получения второго члена пары, метод для установки первого члена пары, метод для установки второго члена пары , Класс должен быть параметризован по двум типам: один для первого члена и один для второго члена пары.

Это правильная реализация для этого вопроса?

public class Pair<firstThing, secondThing>{
   private firstThing first;//first member of pair
   private secondThing second;//second member of pair

   public Pair(firstThing first, secondThing second){
     this.first = first;
     this.second = second;
   }

   public void setFirst(firstThing first){
    this.first = first;
   }

   public void setSecond(secondThing second) {
     this.second = second;
   }

   public thing getFirst() {
     return this.first;
   }

   public thing getSecond() {
     return this.second;
   }
}

Ответы [ 14 ]

1 голос
/ 18 мая 2011

Параметризация класса должна осуществляться по двум типам: один для первого члена и один для второго члена пары.

У вас есть только один параметр.

вам нужно что-то вроде Pair<F,S> и использовать F, где вы используете thing для первого и S, где thing для второго.

0 голосов
/ 28 января 2017

Я реализовал нечто подобное, но со статическим компоновщиком и цепными сеттерами

public class Pair<R, L> {

private R left;
private L right;

public static <K,V> Pair<K, V> of(K k, V v) {
    return new Pair<K,V>(k, v);
}

public Pair() {}

public Pair(R key, L value) {
    this.left(key);
    this.right(value);
}

public R left() {
    return left;
}

public Pair<R, L> left(R key) {
    this.left = key;
    return this;
}

public L right() {
    return right;
}

public Pair<R, L> right(L value) {
    this.right = value;
    return this;
}
}
0 голосов
/ 02 марта 2016

Моя версия пары. Это также обрабатывает сравнения. PS: большая часть кода взята из AOSP.

package util;

import java.util.Objects;

public class Pair<F extends Comparable<F>, S extends Comparable<S>>
  implements Comparable<Pair<F, S>> {

    public final F first;
    public final S second;

    /**
     * Constructor for a Pair.
     *
     * @param first  the first object in the Pair
     * @param second the second object in the pair
     */
    public Pair(F first, S second) {
        this.first = first;
        this.second = second;
    }

    /**
     * Checks the two objects for equality by delegating to their respective
     * {@link Object#equals(Object)} methods.
     *
     * @param o the {@link Pair} to which this one is to be checked for equality
     * @return true if the underlying objects of the Pair are both considered
     * equal
     */
    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Pair)) {
            return false;
        }
        Pair<?, ?> p = (Pair<?, ?>) o;
        return Objects.equals(p.first, first) && Objects.equals(p.second, second);
    }

    /**
     * Compute a hash code using the hash codes of the underlying objects
     *
     * @return a hashcode of the Pair
     */
    @Override
    public int hashCode() {
        return (first == null ? 0 : first.hashCode()) ^ (second == null ? 0 : second.hashCode());
    }

    /**
     * Convenience method for creating an appropriately typed pair.
     *
     * @param a the first object in the Pair
     * @param b the second object in the pair
     * @return a Pair that is templatized with the types of a and b
     */
    public static <A extends Comparable<A>, B extends Comparable<B>> Pair<A, B> create(A a, B b) {
        return new Pair<>(a, b);
    }

    @Override
    public int compareTo(Pair<F, S> that) {
        int cmp = this.first.compareTo(that.first);
        if (cmp == 0)
            cmp = this.second.compareTo(that.second);
        return cmp;
    }
}
0 голосов
/ 18 мая 2011

thing - это Переменная типа в необычной записи - обычно мы используем одну последнюю букву в верхнем регистре (например, T).Затем: переменная типа не имеет методов, поэтому ваши геттеры не будут компилироваться.

Быстрое улучшение: замените все thing на T

Быстрое исправление для геттеров:

public T getFirst() {
 return first;
}

public T getSecond() {
 return second;
}

Одно требование состояло в том, чтобы разрешить два разных типа для членов пары.Таким образом, подпись класса должна выглядеть так:

public Pair<S,T> {
  private S first;
  private T second;
  //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...