2015-10-10 1 views
-4

У меня есть классLinkedHashMap поиск

class polygon 
{ 
    private String name; 
    private int quantity; 

    // default constructor 
    private polygon() 
    { } 

    public String get name() { 
     return name; 
    } 
    public void setname(String name) { 
     this.name = name; 
    } 

    public int getquantity() { 
     return quantity; 
    } 
    public void setquantity(int quantity) { 
     this.quantity = quantity; 
    }  
} 

, а также у меня есть карта, как это:

LinkedHashMap<Integer, polygon> polymap = new LinkedHashMap<Integer, polygon>(); 

У меня есть два вопроса:

  1. Как я могу найти, если есть элемент с определенным значением, который имеет имя «квадрат»?
  2. Как я могу получить весь член с наименьшим количеством?

Спасибо.

+0

Как вы думаете, это сработает? Я предлагаю перебирать значения «Карта» и фильтровать то, что вы ищете. – Flown

+0

, так как я больше знаком с C++, я знаю, что это просто возможно, используя bood :: bind, но я новичок в java. Мне интересно, есть ли лучший способ, чем повторение значений. –

+0

1. Вы должны сравнить с каждым 'именем' на карте 2. Сортировать карту в порядке убывания в зависимости от' количество'. – Satya

ответ

0
LinkedHashMap<Integer, polygon> polymap = new LinkedHashMap<Integer, polygon>(); 
  1. Как я могу найти, если есть элемент с определенным значением, которое имеет название как «квадрат»?

containsValue() В использует равно способ найти совпадение. Вы можете переопределить метод equals() класса polygon. Затем вы можете использовать containsValue(new polygon()), чтобы узнать, существует ли это значение. Реализация метода equals полностью зависит от поля имени многоугольного класса. Что-то вроде этого:

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (!(o instanceof polygon)) return false; 

    polygon polygon = (polygon) o; 

    if (!name.equals(polygon.name)) return false; 

    return true; 
} 

Примечание: Вы перекрывая equals() метод класса, поэтому могут иметь некоторые аффекты стороны, как вы используете его в других местах в вашем приложении.

  1. Как я могу получить весь член с наименьшим количеством?

Я хотел бы предложить вам поддерживать отдельную PriorityQueue для поиска наименьшую количество polygon. Предоставьте пользователю Comparator при инициализации очереди.

+1

Специальные изменения класса для «упрощения» одной задачи с риском (как вы правильно заявляете) о нарушении вашей программы в другом месте вряд ли «лучшая практика». Учитывая ваш ответ относительно №2: почему бы не сделать то же самое для №1? – laune

+0

@laune Поддержание структуры нескольких данных связано с накладными расходами и ошибками. Я думаю, что если он задумается о первой структуре данных карты, это будет здорово. Я просто пытался работать с предоставленной информацией. – YoungHobbit

+0

@YuongHobbit благодарит за ваш ответ. У вас есть идея относительно структуры карты? Моя карта содержит много участников. Я знаю, что boost :: unordered_map был бы хорошим началом, если бы писал на C++, но в java у меня нет большого опыта. –

1

Что мы узнали из комментариев и обновлений: Polygon - это класс с членами. Имя строки (возможно, но не обязательно уникальное) и количество int (без ограничений). Существует также отметка о времени, и это целое число используется в качестве ключа в

Map<Integer,Polygon> polymap 

Чтобы найти все многоугольники с заданным именем:

for(Polygon polygon: polymap.values()){ 
    if(polygon.getName().equals(givenName)){ //... } 
} 

Теперь это последовательный поиск и может занять некоторое время если количество записей очень велико. Предполагая, что имена уникальны, время доступа O (1) может быть достигнуто путем создания другой Карты параллельно с polyap, сопоставления именных строк с объектами Polygon. (Рассмотрите дополнительные усилия для удаления, но Map.remove (.,.) Должен помочь.)

Чтобы найти все многоугольники с минимальным количеством, определяют минимум, сохраняя при этом набор многоугольников с этим минимумом:

int min = Integer.MAX_VALUE; 
Set<Polygon> polyset = new HashSet<>(); 
for(Polygon polygon: polymap.values()){ 
    int qtty = polygon.getQuantity(); 
    if(qtty < min){ 
     min = qtty; 
     polyset.clear(); 
     polyset.add(polygon); 
    } else if(qtty == min){ 
     polyset.add(polygon); 
    } 
} 

Опять же, последовательный поиск, но вот вторая карта потребует Multimap , т.е. Map<Integer,Collection<Polygon>>.

+0

Большое спасибо за ваш ответ, если мы предположим, что имя многоугольника в polyap уникально, как я могу улучшить поиск? –

+0

Как я писал: вы можете создать другую карту вместо или в дополнение к polyap, где имя является ключом. Но я не могу придумать код - создание полимапа - это не в вашем вопросе. - Или вы можете модифицировать polyap с equals * и hashCode * (!), Если идентификация Polymap может быть основана на поле имени (которое я не могу рекомендовать, не зная, что еще находится в этой программе) - см. Ответ YoungHobbit. – laune