W jaki sposób posortować hashmape po wartosci (obiekty)

0

Witam,
Tak jak w temacie. Kod:

import java.util.HashMap;
import java.util.Scanner;

public class BackPack
{
	private HashMap<Integer,BackPack> things = new HashMap<Integer,BackPack>();
	private int value;
	private int size;
	
	public BackPack()
	{
		reading();
	}
	public BackPack(int v,int s)
	{
		value = v;
		size = s;
	}
	public int getSize()
	{
		return size;
	}
	public int getValue()
	{
		return value;
	}
	
	public void reading()
	{
		Scanner in = new Scanner(System.in);
		int numberOfThings = Integer.parseInt(in.next());
		if(numberOfThings > 100)
		{
			System.out.println("Entered a wrong value !");
			in.close();
			return;
		}
		sizeJas = Integer.parseInt(in.next());
		sizeStas = Integer.parseInt(in.next());
		if(sizeJas > 500 || sizeStas > 500)
		{
			System.out.println("Entered a wrong value !");
			in.close();
			return;
		}
		int j = 1;
		while(numberOfThings > 0)
		{
			int value = in.nextInt();
			int size = in.nextInt();
			things.put(j,new BackPack(value,size));
			j++;
			numberOfThings--;
		}
		in.close();
	}

	public static void main(String[] args)
	{
		new BackPack();
	}
	
}

Chciałbym posortować tą hashmapę po wartościach BackPack (po polu value).
Może inaczej: things.put(j,new BackPack(value,size)); --> przy tej deklaracji chodzi mi o posortowanie po "value"
Wiem, że trzeba użyć do tego Comparator, ale nie wiem za bardzo w jaki sposób. Widziałem na innej stronie jak ktoś sortował HashMape po wartościach, ale nie po obiektach.

0

To zależy jakie kryterium sortowania przyjmiesz. W każdym razie tutaj masz jedną z możliwych implementacji sortowania pola values:
http://stackoverflow.com/questions/8119366/sorting-hashmap-by-values

0

Moje rozwiązanie pisane na szybko dlatego dość paskudne i nieodporne na nulle itp:

class MapByValueComparator implements Comparator<Map.Entry<Comparable<?>, Comparable<?>>> {
    @Override
    public int compare(Map.Entry<Comparable<?>, Comparable<?>> o1, Map.Entry<Comparable<?>, Comparable<?>> o2) {
        return o1.getValue().compareTo(o2.getValue());
    }

    public void usage(Map<Comparable<?>, Comparable<?>> map) {
        Set<Map.Entry<Comparable<?>,Comparable<?>>> entries = map.entrySet();
        Collections.sort(new LinkedList(entries), this);
    }

}

metoda usage pokazuje użycie, ale nie należy jej stosować. Ogólnie przekazujesz do sortowania obiekty klasy Entry, które siedzą w mapie i reprezentują parę klucz=>wartość. Wyciągasz wartości i po nich sortujesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1