2016-12-24 3 views
1

У меня есть TreeSet, содержащий объекты клиента. Он содержит 10 объектов круга. Я хочу запустить две петли на наборе, чтобы я мог сравнивать каждый элемент со всеми элементами ниже. Вот пример, который я могу сделать с List, но я не получаю, как я могу сделать это с SetВыполнить две петли над Уст.

for (int i = 0; i < set.size(); i++) { 
// Circle circle = set.get(i); 

    for (int j = i+1; i < set.size(); j++) { 
     // Circle circle = set.get(j); 

    } 

} 

я могу сделать это с List<String> list=new ArrayList<>(set), где я могу достичь и сортировки (по набору) и запустить две петли на но это будет дополнительная память.

Что я хочу достичь: -

для каждой окружности в наружном контуре (отсортированные по радиусу в порядке убывания), я хочу, чтобы вычислить площадь каждого круга во внутреннем контуре, если этот круг является действительным (предположим, что в объекте круга есть свойство, которое указывает, действительно ли оно или нет). Если действительно, мне нужно вычислить умножение окружности области в наружной и внутренней петле и найти Макс результат

+1

Оффлайн, это звучит так, будто вы, возможно, слишком сильно себя чувствуете. Что вы хотите сделать в теле внутреннего 'for'? – Mureinik

+2

В чем смысл? Учитывая, как работает TreeSet, вы ** знаете **, что первый клиент будет <ко всем последующим. TreeSet - это SortedSet. Чего вы пытаетесь достичь? –

+0

@Mureinik i wan сделать некоторые вычисления со всем элементом во внутреннем цикле (т.е.e для каждого элемента во внешнем цикле, я хочу сделать некоторую обработку для всех элементов во внутреннем цикле) –

ответ

6

Используйте Еогеасп:

for (Customer customer : set) {  
    for (Customer otherCustomer : set) { 

     // do your processing 
    } 
} 

Вы не можете восстановить элемент из Set с помощью метода get(int index) что характерно для интерфейса List.


К сожалению, я не обратить внимание на ваше внутреннее условие цикла:

for (int j = i+1; i < set.size(); j++) { 

Вы хотите на самом деле внутренний цикл начинается после того, как текущий элемент внешнего контура. Вы можете достичь этого, объявив свой сет с TreeSet класса и с помощью метода tailSet():

/** 
* @throws ClassCastException {@inheritDoc} 
* @throws NullPointerException if {@code fromElement} is null and 
*   this set uses natural ordering, or its comparator does 
*   not permit null elements 
* @throws IllegalArgumentException {@inheritDoc} 
* @since 1.6 
*/ 
public NavigableSet<E> tailSet(E fromElement, boolean inclusive) { 
    return new TreeSet<>(m.tailMap(fromElement, inclusive)); 
} 

Таким образом, вы могли бы начать второй цикл после текущего элемента внешнего контура:

TreeSet<Customer> set = new TreeSet(); 
for (Customer customer : set) { 
    for (Customer otherCustomer : set.tailSet(customer, false) { 
    // do your processing 
     System.out.println(""); 
    } 
} 
+0

Посмотрите, как OP хочет инициализировать 'j'. Это неправильное поведение. – Mureinik

+0

Мы можем использовать уплотнитель ... –

+0

@Mureinik Спасибо. Я не обращал на это внимания. Я обновил свой ответ. – davidxxx

-1

Вы можете реализовать интерфейс компаратора для того же самого. Он будет сортировать по умолчанию в соответствии с вашими требованиями.

Ниже вы найдете код для этого.

import java.util.Comparator; 
import java.util.TreeSet; 

public class Main { 

    public static void main(String a[]){ 
     //I am sorting list by name. 
     TreeSet<Empl> empls = new TreeSet<Empl>(new EmplNameComp()); 
     empls.add(new Empl("Jitendra",3000)); 
     empls.add(new Empl("Kumar",6000)); 
     empls.add(new Empl("Balla",2000)); 
     empls.add(new Empl("Puja",2400)); 
     for(Empl e:empls){ 
      System.out.println(e); 
     } 
     System.out.println("=====END======"); 
    } 
} 

class EmplNameComp implements Comparator<Empl>{ 

    @Override 
    public int compare(Empl e1, Empl e2) { 
     return e1.getName().compareTo(e2.getName()); 
    } 
} 

class Empl{ 

    private String name; 
    private int salary; 

    public Empl(String n, int s){ 
     this.name = n; 
     this.salary = s; 
    } 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public int getSalary() { 
     return salary; 
    } 
    public void setSalary(int salary) { 
     this.salary = salary; 
    } 
    public String toString(){ 
     return "Name: "+this.name+" AND Salary: "+this.salary; 
    } 
} 
+0

Почему downvote мой ans? –

+0

@scott miles Вам не нужно использовать две петли для сравнения и сортировки, которые вы можете использовать уплотнитель –

+3

Потому что он вообще не отвечает на вопрос. И BTW, это называется компаратором, а не компактором. –

3

Вы можете использовать tailSet, чтобы получить все элементы, начиная с текущего:

for (Customer outer : treeSet) {  
    for (Customer inner : treeSet.tailSet(outer, false)) { 
     // ... 
    } 
} 

Обратите внимание на второй параметр, к которому нужно пройти false. Он сообщает набору, чтобы исключить элемент outer.

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