私は現在マップを使用していますが、プログラムを効果的に機能させる方法に困惑しています。マップを反復処理してキーと値を取得し、アルファベット順と逆アルファベット順で非常に簡単に並べ替えることができます。これにはカスタムコンパレータを使用しました。ただし、現在、値が最も多いキーに基づいてマップを並べ替えようとしています。値は私が作成したオブジェクトのリストであり、このシナリオと考えることができます。
たくさんの町(文字列型のキー)があるアトラス(カタログのような)があります。Shops(List)が含まれています。これを並べ替えて、最も多くの店舗がある町が最初に表示され、降順で並べ替えられ、2番目の並べ替えが町に基づいてアルファベット順になり、これを表す文字列が返されるようにします。
私はこれまで、アルファベット順と逆アルファベット順のクラスごとに別々のクラスでComparatorインターフェースを使用してきましたが、学習目的で同じパターンに従いたいと思っていますが、これは完全に困惑しています。
例:
class Atlas {
Map<String, List<Shop> atlas = new HashMap<String, List<Shop>();
void addShop(Shop shop){
//if(Atlas already contains){
get the town and add the shop to it.
}
else{
add the town as the key and the shop as the value in the list
}
}
List<Shop> getAllShopsFromTheGivenTown(String givenTown){
//if(Atlas contains givenTown){
return the givenTown from the List.
}
else{
//Return an ArrayList emptyList
}
}
public String returnAllTownsAndShopsAlphbetically(){
String tmpString = "";
List<String> keys = new LinkedList<String>(atlas.keySet());
TownComparatorAtoZ tc = new TownComparatorAtoZ();
Collections.sort(keys, tc);
for(String town : keys){
List<Shop> shops = new LinkedList<Dealer>(atlas.get(town));
ShopComparatorAtoZ sc = new ShopComparatorAtoZ();
Collections.sort(shop, sc);
for(Shop shop : shops){
if(tmpString.isEmpty()){
tmpString = tmpString + town + ": " + shop.getName();
}
else if(tmpString.contains(town)){
tmpString = tmpString + ", " + shop.getName();
}
else{
tmpString = tmpString + " | " + town + ": " + shop.getName(); }
}
}
return tmpString;
}
}
上からわかるように(最もクリーンで効率的ではありませんが)、アルファベット順に戻り、文字列ビルダーに再フォーマットされます。しかし、コンパレータを使用して自分が求めていることを達成するにはどうすればよいのか疑問に思っています。誰かが実際に何をしているのかを説明したコードスニペットを提供できれば、それを取得するだけでなく、その方法を理解することができれば幸いです。コードの塊をコピーして貼り付けましたが、それを理解するには、コード内で視覚的に確認する必要があります。
SO出力私は次のようなものになりたい
マンチェスター:m&s、h&m、schuch | バーミンガム:ゲーム、ボディショップ| リバプール:スポーツ