2015-03-19 1 views
1

Я создал класс под названием Pair, который является общим типом L и R, что в основном позволило бы мне хранить пары.Сортировка Arraylist, созданная с использованием Generic Class в Java

Я использую Arraylist для хранения типа Pair, но я не уверен, как сортировать (и, возможно, найти все элементы) в ArrayList на основе key/value, а также распечатать ArrayList.

ArrayList<Pair> a = new ArrayList<Pair>(); 

    Pair p = new Pair(1,1); 
    a.add(p); 
    a.add(new Pair(1,3)); 

    //System.out.println(help please); 

Ниже Pair Класс

class Pair<L,R> { 

     L left; 
     R right; 

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

     public L getLeft() { return left; } 
     public R getRight() { return right; } 

     @Override 
     public int hashCode() { return left.hashCode()^right.hashCode(); } 

     @Override 
     public boolean equals(Object o) { 
     if (!(o instanceof Pair)) return false; 
     Pair pairo = (Pair) o; 
     return this.left.equals(pairo.getLeft()) && 
       this.right.equals(pairo.getRight()); 
     } 




    } 
+0

ли объявляя 'ArrayList', содержащие сырые' экземпляры Pair' вызвать проблемы для вас? Вы скомпилировали? – Dragan

+0

Здесь вы используете огромное количество исходных типов: 'Pair' вместо' Pair ', например. Вы действительно должны это исправить, так что у вас есть безопасность типа. –

ответ

2

Вот пример рабочего кода для вас (он использует некоторые функции Java 8, но их можно поменять, если вы ограничены более низкой версией). Надеюсь это поможет!

Спасибо, Дункан

package com.hiveit; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.stream.Collectors; 

public class Pair<L extends Comparable<L>, R extends Comparable<R>> implements Comparable<Pair<L, R>> { 

    L left; 
    R right; 

    public Pair(final L left, final R right) { 
    this.left = left; 
    this.right = right; 
    } 

    public L getLeft() { 
    return left; 
    } 

    public R getRight() { 
    return right; 
    } 

    @Override 
    public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + (left == null ? 0 : left.hashCode()); 
    result = prime * result + (right == null ? 0 : right.hashCode()); 
    return result; 
    } 

    @Override 
    public boolean equals(final Object obj) { 
    if (this == obj) { 
     return true; 
    } 
    if (obj == null) { 
     return false; 
    } 
    if (getClass() != obj.getClass()) { 
     return false; 
    } 
    final Pair<?, ?> other = (Pair<?, ?>) obj; 
    if (left == null) { 
     if (other.left != null) { 
     return false; 
     } 
    } else if (!left.equals(other.left)) { 
     return false; 
    } 
    if (right == null) { 
     if (other.right != null) { 
     return false; 
     } 
    } else if (!right.equals(other.right)) { 
     return false; 
    } 
    return true; 
    } 

    @Override 
    public int compareTo(final Pair<L, R> other) { 

    final int compareLeft = left.compareTo(other.left); 

    if (compareLeft != 0) { 
     return compareLeft; 
    } 

    return right.compareTo(other.right); 
    } 

    @Override 
    public String toString() { 
    return "Pair [left=" + left + ", right=" + right + "]"; 
    } 

    public static String listToString(final List<?> list) { 
    return list.stream().map((pair) -> { 
     return pair.toString(); 
    }).collect(Collectors.joining(", ")); 
    } 

    public static void main(final String[] args) { 

    final List<Pair<Integer, Integer>> a = new ArrayList<>(); 

    a.add(new Pair<>(1, 1)); 
    a.add(new Pair<>(2, 1)); 
    a.add(new Pair<>(2, 3)); 
    a.add(new Pair<>(1, 2)); 
    a.add(new Pair<>(1, 3)); 
    a.add(new Pair<>(2, 2)); 

    final List<Pair<Integer, Integer>> sortedByKey = new ArrayList<>(a); 
    sortedByKey.sort((o1, o2) -> { 
     return o1.getLeft().compareTo(o2.getLeft()); 
    }); 

    sortedByKey.stream().map((pair) -> { 
     return pair.toString(); 
    }).collect(Collectors.joining(", ")); 

    final List<Pair<Integer, Integer>> sortedByValue = new ArrayList<>(a); 
    sortedByValue.sort((o1, o2) -> { 
     return o1.getRight().compareTo(o2.getRight()); 
    }); 

    final List<Pair<Integer, Integer>> sortedByKeyAndValue = new ArrayList<>(a); 
    sortedByKeyAndValue.sort((o1, o2) -> { 
     return o1.compareTo(o2); 
    }); 

    System.out.println("Original     = " + listToString(a)); 
    System.out.println("Sorted by Left   = " + listToString(sortedByKey)); 
    System.out.println("Sorted by Right   = " + listToString(sortedByValue)); 
    System.out.println("Sorted by Left then Right = " + listToString(sortedByKeyAndValue)); 

    } 
} 
+0

Отлично. Спасибо, что нашли время ответить на мой вопрос. Действительно ценю это. – user3353723

2

Ваш Pair класс может, например, implement Comparator<Pair> интерфейс. После этого вы реализуете метод

@Override 
public int compare(Pair o1, Pair o2) { 
    // here you need to implement how one Pair can be compared to another 
    // in the scope of ordering them 
    // you need to fulfil the contract of the Comparator.compare interface 
} 
0

Не используйте класс Pair. Если вам нужна отсортированная, доступная и эффективная коллекция пар ключ/значение с общими типами, используйте TreeMap.

+0

Кроме того, ваш код не нравится, как он компилируется для меня. Например, первое объявление должно быть «ArrayList > a = new ArrayList >();'. Вы также можете использовать вывод типа, если вы находитесь на Java 8. –

+0

Использование 'TreeMap' не сможет обрабатывать случай, когда имеется несколько пар с одинаковым значением' left'. Это не одно и то же. –

+0

Очень верно! Но он упомянул ключ/ценность. Сама концепция состоит в том, что ключи уникальны и указывают на значение. Поэтому, если он действительно хочет массив кортежей, вы правы, но если он хочет ключ/значение, я указываю ему в правильном направлении. Трудно сказать, насколько он знаком с этой темой или какова его фактическая проблема, но учитывая, что сортировка и компараторы являются довольно фундаментальными (и он не придумал их), я думаю, что было хорошо, что я упоминаю об этом. –

Смежные вопросы