如何只用Streams实现这个方法?
How to realize this method only with Streams?
/**
* Get all cities near current city in radius.
*
* @param cityName - city
* @param radius - radius in kilometers for search
* @throws IllegalArgumentException if city with cityName city doesn't exist.
*/
public List<String> getCitiesNear(String cityName, int radius) {
List<String> nearCities = new ArrayList<>();
List<Integer> distances = new ArrayList<>();
for (int i = 0; i < this.citiesNames().size(); i++) {
distances.add(this.getDistance(cityName, this.citiesNames().get(i)));
}
for (int i = 0; i < distances.size(); i++) {
if (distances.get(i) <= radius) {
if (!this.citiesNames().get(i).equals(cityName)) {
nearCities.add(this.citiesNames().get(i));
}
}
}
return nearCities;
}
方法 citiesNames() returns 列表 <"String">。城市名称。
方法“int getDistance(String srcCityName, String destCityName)”returns srcCityName 和 srcCityName 之间的距离。
PS:
class 内禁止使用循环、迭代器。只能使用接受谓词的流和方法。您不能在 class.
中声明其他字段
这是我的作业)
if (citiesNames().contains(cityName) {
return citiesNames().stream()
.filter(city -> getDistance(cityName, city) <= radius)
.collect(Collectors.toList());
}
else {
throw new IllegalArgumentException(cityName + " not found.");
}
filter
方法 returns 仅包含邻近城市的流。
collect
方法创建一个 List
包含过滤流中的所有元素。
使用单独的 类 来存储 cityName
和 distance
怎么样?
这将为您提供 有序 比 radius
更接近目标城市的所有城市的列表。
private final Set<String> cityNames = Set.of();
public List<String> getCitiesNear(String cityName, int radius) {
class CityDistance {
final String cityName;
final int distance;
public CityDistance(String cityName, int distance) {
this.cityName = cityName;
this.distance = distance;
}
}
return cityNames.stream()
.map(curCityName -> new CityDistance(cityName, getDistance(cityName, curCityName)))
.filter(cityDistance -> cityDistance.distance <= radius)
.sorted(Comparator.comparingInt(one -> one.distance))
.map(cityDistance -> cityDistance.cityName)
.collect(Collectors.toList());
}
private int getDistance(String cityNameOne, String cityNameTwo) {
return 0;
}
/**
* Get all cities near current city in radius.
*
* @param cityName - city
* @param radius - radius in kilometers for search
* @throws IllegalArgumentException if city with cityName city doesn't exist.
*/
public List<String> getCitiesNear(String cityName, int radius) {
List<String> nearCities = new ArrayList<>();
List<Integer> distances = new ArrayList<>();
for (int i = 0; i < this.citiesNames().size(); i++) {
distances.add(this.getDistance(cityName, this.citiesNames().get(i)));
}
for (int i = 0; i < distances.size(); i++) {
if (distances.get(i) <= radius) {
if (!this.citiesNames().get(i).equals(cityName)) {
nearCities.add(this.citiesNames().get(i));
}
}
}
return nearCities;
}
方法 citiesNames() returns 列表 <"String">。城市名称。
方法“int getDistance(String srcCityName, String destCityName)”returns srcCityName 和 srcCityName 之间的距离。
PS: class 内禁止使用循环、迭代器。只能使用接受谓词的流和方法。您不能在 class.
中声明其他字段这是我的作业)
if (citiesNames().contains(cityName) {
return citiesNames().stream()
.filter(city -> getDistance(cityName, city) <= radius)
.collect(Collectors.toList());
}
else {
throw new IllegalArgumentException(cityName + " not found.");
}
filter
方法 returns 仅包含邻近城市的流。
collect
方法创建一个 List
包含过滤流中的所有元素。
使用单独的 类 来存储 cityName
和 distance
怎么样?
这将为您提供 有序 比 radius
更接近目标城市的所有城市的列表。
private final Set<String> cityNames = Set.of();
public List<String> getCitiesNear(String cityName, int radius) {
class CityDistance {
final String cityName;
final int distance;
public CityDistance(String cityName, int distance) {
this.cityName = cityName;
this.distance = distance;
}
}
return cityNames.stream()
.map(curCityName -> new CityDistance(cityName, getDistance(cityName, curCityName)))
.filter(cityDistance -> cityDistance.distance <= radius)
.sorted(Comparator.comparingInt(one -> one.distance))
.map(cityDistance -> cityDistance.cityName)
.collect(Collectors.toList());
}
private int getDistance(String cityNameOne, String cityNameTwo) {
return 0;
}