【问题标题】:Run two loops over Set在 Set 上运行两个循环
【发布时间】:2016-12-24 13:12:17
【问题描述】:

我有 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&lt;String&gt; list=new ArrayList&lt;&gt;(set) 做到这一点,我可以实现排序(通过集合)并在列表上运行两个循环,但这将是额外的内存。

我想要达到的目标:-

对于外循环中的每个圆(按半径降序排序),如果该圆有效,我想计算内循环中每个圆的面积(请假设圆对象中有一个属性告诉它是否有效或不)。 如果有效,我需要计算外循环和内循环的圆面积的乘积并找到最大结果

【问题讨论】:

  • 副手,这听起来你可能有点过于复杂了。想在内for的正文中做什么?
  • 有什么意义?鉴于 TreeSet 的工作方式,您知道第一个客户将是
  • @Mureinik 我想对内循环中的所有元素进行一些计算(即对于外循环中的每个元素,我想对内循环中的所有元素进行一些处理)
  • @JBNizet 请查看我的更新以了解我想要实现的目标
  • @JBNizet 哎呀,我错过了他说他有一个 TreeSet 去!

标签: java list set


【解决方案1】:

使用 foreach :

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

       // do your processing
    }   
}

您无法使用特定于List 接口的get(int index) 方法从Set 检索元素。


对不起,我没有注意你的内循环条件:

 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("");
    }
}

【讨论】:

  • 仔细查看 OP 想要如何初始化 j。这不是正确的行为。
  • @Mureinik 谢谢。我没有注意它。我更新了我的答案。
  • @davidxxx 你最好使用tailSet而不是subSet:docs.oracle.com/javase/8/docs/api/java/util/…
  • @davidxxx 现在好多了!
【解决方案2】:

您可以使用tailSet 获取所有从当前项开始的项目:

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

注意您需要传递false 的第二个参数。它告诉集合排除outer 元素。

【讨论】:

    【解决方案3】:

    您也可以实现 Comparator 接口。默认情况下,它将根据您的要求进行排序。

    请在下面找到相同的代码。

    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;
        }
    }
    

    【讨论】:

    • @scott miles 您无需使用两个循环来比较和排序您可以使用压缩器的顺序
    • 因为它根本不回答问题。顺便说一句,它被称为比较器,而不是压实器。
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多