2017-08-29 9 views
1

昨日、テクニカルラウンドに実装するタスクが次のように与えられました。私はあなたがすべてのタスクを実装することを望んでいない、私は自分自身を試みたが、私は質問3で立ち往生した。私の質問はどのように登録番号で検索するために実装するのですか?質問5によれば、より効率的でなければならないからです。私はHashMapを試しましたが、解決できませんでした。複数の引数でArrayListを検索する

  1. 犬のリストをアルファベット順に、名前をつけて、次に繁殖させて管理します。
  2. 新しい犬を追加する方法を提供します。
  3. 登録番号で検索する方法を提供します。
  4. 名前で検索する方法を提供します。
  5. 利用可能な最も効率的な検索手法を採用しています。
  6. 犬の初期リストを受け入れるコンストラクターです。
  7. シンプルな構築物がDogクラスを改善するために何ができるか

DogSort.java

public class DogSort { 

    public static void main(String[] args) { 
     ArrayList<Dog> listDog = new ArrayList<Dog>(); 

     Scanner sc = new Scanner(System.in); 

     listDog.add(new Dog("Max", "German Shepherd", "33")); 
     listDog.add(new Dog("Gracie","Rottweiler","11")); 
     listDog.add(new Dog("Sam", "Beagle", "22")); 
     System.out.println(listDog); 

     System.out.println("Select one of the following commands: "); 
     System.out.println(
       "Press 1: Sort by name\n"+ 
       "Press 2: Sort by breed\n" + 
       "Press 3: Add new dog\n" + 
       "Press 4: Search by registration number\n" + 
       "Press 5: Serach by Name\n "); 

     int i = sc.nextInt(); 
     switch (i){ 
      case 1: Collections.sort(listDog, Dog.COMPARE_BY_NAME); 
       System.out.println(listDog); 
       break; 
      case 2: 
       Collections.sort(listDog, Dog.COMPARE_BY_BREED); 
       System.out.println(listDog); 
       break; 
      default: 
       System.out.println("Invalid input"); 
       break;  
     } 

    } 
} 

Dog.java

class Dog { 
    private String name; 
    private String breed; 
    private String registrationNumber; 


    public Dog(String name, String breed, String registrationNumber) { 
     this.name = name; 
     this.breed = breed; 
     this.registrationNumber = registrationNumber; 
    } 

    public String getName() { 
     return this.name; 
    } 

    public String getBreed() { 
     return this.breed; 
    } 

    public String getRegistrationNumber() { 
     return this.registrationNumber; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public void setBreed(String breed) { 
     this.breed = breed; 
    } 

    public void setRegistrationNumber(String registrationNumber) { 
     this.registrationNumber = registrationNumber; 
    } 

    @Override 
    public String toString() { 
     return this.name; 
    } 


    public static Comparator<Dog> COMPARE_BY_NAME = new Comparator<Dog>() { 
     public int compare(Dog one, Dog other) { 
      return one.name.compareTo(other.name); 
     } 
    }; 

    public static Comparator<Dog> COMPARE_BY_BREED = new Comparator<Dog>() { 
     public int compare(Dog one, Dog other) { 
      return one.breed.compareTo(other.breed); 
     } 
    }; 
} 
+5

「HashMap」は正しい方向です。何を試しましたか、何がうまくいかなかったのですか? – Thomas

+0

@Thomasコードはありますが、コードを表示する方法がわかりません。私は答えのセクションに入力することはできません。 – jParmar

+0

代わりに質問に編集してください。 – Thomas

答えて

1

解決するmutlipleの方法があります。問題。

最初の解決策は、Java 8 Stream APIを使用することです。検索し、結果をフィルタリングし、フィルタリングされた結果を返すことができます。あまりにも複雑なロジックではなく、あまりにも多くのエントリを持っていない場合、これは素晴らしいです。より多くのエントリーをお持ちなら、私は別の解決策を探します。

第2の解決策は、検索したい特定のキーで複数のマップを使用することです。実装は、名前を検索するときに少し複雑になる可能性があります(1つ以上の犬が同じ名前を持つ可能性があります)。あなたが探しているものによっては、このケースでは指定されたマップを使用することができます。

第3の解決策(そして多少大きめのもの)...しばらくそれを拡張しようとするなら、本当の検索エンジンを探すことができます。 Elasticsearchは埋め込み検索エンジンとしても存在します。しかし、私が言ったように、これは少し大きすぎるかもしれません、あなたが検索し、結合するために多くのデータと異なるフィールドを持っている場合にのみ意味があります。

他のソリューションにも興味があります。