0

我正在寻找按公司名称对数组进行排序,仅打印在特定时间之前开放的公司......在打印之前

public void printCompanies(int time)
{
    Iterator <Company> it = CompanyList.iterator();
    while( it.hasNext()) {
        Company a = it.next();
        if(a.getTime() == (time)) {
            Collections.sort(CompanyList.getName());
        }
    }
}

我收到错误消息,找不到方法 getName(),此方法在另一个类中有特色。那不是继承的等等。

我在正确的路线上吗?/我将如何解决这个错误

如果我使用

   Collections.sort(Company.getName());

然后我收到错误“无法从静态上下文引用非静态方法 getName()?

4

3 回答 3

2

据我了解, CompanyList 是一个列表,而 getName() 是单个公司的方法。这就是错误的来源。

要使代码按您的意愿工作,您需要了解 Collections.sort ( JavaDoc ) 的工作原理。使其按名称对公司进行排序的最简单方法是修改 Company 类以实现接口Comparable<Company>( JavaDoc ) 并实现compareTo方法以便比较两家公司的名称。假设名称是字符串,它可能不会比

int compareTo(Company other) {
    return this.getName().compareTo(other.getName());
}

或者,如果您需要根据不同的标准进行排序,您可以使用稍微复杂但更灵活的Comparators( JavaDoc )。

于 2013-10-23T22:54:10.060 回答
1

简短的回答是,不,你不是在正确的道路上;-)

该答案的较长版本是您不能在列表成员上调用Collections.sort,您需要在列表中调用它。

默认情况下,Collections.sort将使用成员的自然排序,如果你想改变你需要传入你自己的比较器。

对列表进行排序后,您可以对其进行迭代以对其进行过滤并对结果进行一些处理。

因此,您想先对列表进行排序,然后对其进行过滤,例如:

public void printCompanies(int time)
{
  Collections.sort(companyList, 
                   new Comparator() {
                     public int compare(Object o1, Object o2) {
                       if (o1 == o2)
                         return 0;
                       if (o1 == null)
                         return -1;
                       if (o2 == null)
                         return 1;
                       Company c1 = (Company) o1;
                       Company c2 = (Company) o2;
                       return c1.getName().compareTo(c2.getName());
                     }
                   });
  Iterator <Company> it = companyList.iterator();
  while(it.hasNext()) {
    Company a = it.next();
    if(a.getTime() <= (time)) {
      // Do something
    }
  }
}
于 2013-10-23T22:46:54.373 回答
0

就像其他人所说的那样,您需要在迭代之前进行一次排序。但是,为了对名称进行排序,您需要做的是更改Company类以实现Comparable<Company>接口(首选解决方案),或者在您正在迭代的地方添加一个内部类 implements Comparator<Company>。无论哪种方式,您都将调用companyA.getName().compareTo(companyB.getName())接口将强制您实现的方法中的内容。

如果您采用第一条路线,您可以调用Collections.sort(list);然后遍历列表。第二条路线将迫使你打电话Collections.sort(list, new MyCustomComparator());

顺便说一句,如果您CompanyList是可迭代的,请在调用这些排序方法之一后使用for (Company company : companyList) {...}而不是创建迭代器。

于 2013-10-23T22:54:09.923 回答