2013-10-08 3 views
0

я получил вопрос о том, как возвращать значения, когда метод вызывается в основном методе, вот мой частичный код:как вернуть значение в методе в Java

import java.util.ArrayList; 


public class Race { 

private ArrayList<Car>cars; 


public Race(){ 
cars=new ArrayList<Car>(); 
} 

public Car find(double position){ 
for(Car d:cars){ 
    if(d.getPosition()==position){ 
     return d; 
    } 
} 
return null; 
} 
................. 

Когда я назвал метод поиска в основном класс:

 public class Test { 

public static void main(String[] args) { 

    Race race=new Race(); 
    Car mazda=new Car("Mazda",1.0,1.0,2.0,2.0); 
    Car honda=new Car("Honda",1.0,1.0,1.0,2.0); 
    race.addCars(mazda); 
    race.addCars(honda); 

    System.out.println(race.find(1.0).getName()); 

третьи значения позиции, что означает, мазда и Хонда имеют ту же позицию, и предполагается печатать оба, но когда я запускаю его, он печатает только Мазду, я запутался, пожалуйста, сообщите, ура!

+1

На боковой ноте вы не должны делать d.getPosition() == position', потому что float имеет ограниченную точность и не может сравниться с этим. Либо используйте ints, либо выполните что-то вроде 'Math.abs (d.getPosition() - position) <0.000001'. –

+0

возвратите коллекцию или передайте ее как параметр методу –

ответ

2

пара вещей здесь:

  1. Вы можете вернуть только одно из метода. Ваш метод возвращает тип Car, что означает, что вы вернетесь буквально одинCar объект. Если вы хотите вернуть несколько, вам нужно либо вернуть массив автомобилей (Car[]), либо коллекцию автомобилей (например, List<Car>, Set<Car> и т. Д.).
  2. Использование двойных чисел с точным равенством - плохая идея. Из-за округления и того, что потенциально выходит из области этого вопроса, значения double не всегда могут быть точно такими, какие вы ожидаете (например, 1.0 может не всегда означать 1.0, это может быть 0.999999... и т. Д.). Либо используйте целые числа, либо см. this answer (или аналогичные) о том, как сравнивать значения double в Java.
+0

Спасибо, Джонатан! –

3

Вы можете вернуть только одно значение из метода. Но вы можете вернуть List:

public List<Car> find(double position) { 
    List<Car> ret = new ArrayList<Car>(); 
    for (Car c : cars) 
     if (c.getPosition() == position) 
      ret.add(c); 
    return ret; 
} 

Если это все, что вы делаете, вы получите этот результат:

[mazda, toyota] 

Если вы хотите каждый на отдельной строке, вам нужно будет перебирать список в main и печати каждой из них:

for (Car c : race.find(1.0)) 
    System.out.println(c.getName()); 
+0

Привет, я попробовал ваше решение, но как я должен обращаться с System.out.println в методе main(), мой старый способ не работает с вашим решением, getName () метод не работает –

+0

@peiwang Я отредактировал это решение. – tbodt

0

две проблемы: 1, вы можете вернуть только один Object из метода, и 2, ваш метод возвращает я когда он находит Car в запрошенном положении. Вам нужно взглянуть на свой тип возврата и внести некоторые корректировки, если вы хотите иметь возможность печатать более одного автомобиля.

Вместо этого, сделать что-то вроде этого:

public List<Car> find(double position){ 
List<Car> cars = new ArrayList<Car>(); 
for(Car d:cars){ 
    if(d.getPosition()==position){ 
     cars.add(d); 
    } 
} 
return cars; 
} 

Вы тогда должны были бы сделать некоторые итерация назад в методе main() распечатать каждый возвращенный автомобиль, например, так:

for(Car car : race.find(1.0)) 
{ 
    System.out.println(car.getName()); 
} 
+0

Привет, я попробовал ваше решение, но как мне обратиться к System.out.println в методе main(), мой старый способ не работает с вашим решением, метод getName() не работает –

+0

Как я уже сказал, тогда вы необходимо выполнить некоторую повторную процедуру в вашем методе 'main()', чтобы распечатать каждый возвращенный автомобиль. – StormeHawke

+0

@peiwang там Я даже привел пример, как это сделать – StormeHawke

0

Вам нужно изменить тип возврата от Car до Set<Car>. Причина в том, что когда вы найдете первый автомобиль (в данном случае мазда), вы выполняете линию return d;. Это означает, что это конец вашей функции. Что вам нужно сделать, это объявить Set<Car> локально в функции и Intead письма return d вы пишете Set.add(d);

+0

Лично я бы сказал, что список будет лучшим выбором, чем набор в этом случае – StormeHawke

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