我正在寻找最好的解决方案,我已经有了一个可行的解决方案,但我有兴趣看看是否有更好的解决方案。尽管标题可能另有暗示,但我非常愿意接受不涉及数组列表的解决方案。
我的问题本质上是,有没有一种方法可以在数组中搜索(每次添加都有多个元素)特定的字符串、int 或 bool。
获取以下代码片段;
...
public KeplerLabFinal(String name, double mass, double semiMajorAxis){
this.getPlanetName = name;
this.getPlanetMass = mass;
this.getSemiMajorAxis = semiMajorAxis;
}
...
(主内)
public static void main(String[] args){
ArrayList<KeplerLabFinal> planets = new ArrayList<>();
planets.add(new KeplerLabFinal("Mercury", 3.285e23, 0.38710));
planets.add(new KeplerLabFinal("Venus", 4.867e24, 0.72333));
planets.add(new KeplerLabFinal("Earth", 5.972e24, 1));
planets.add(new KeplerLabFinal("Mars", 6.39e23, 1.52366));
planets.add(new KeplerLabFinal("Jupiter", 1.898e27, 5.20336));
planets.add(new KeplerLabFinal("Saturn", 5.683e26, 9.53707));
planets.add(new KeplerLabFinal("Uranus", 8.681e25, 19.1913));
planets.add(new KeplerLabFinal("Neptune", 1.024e26, 30.0690));
planets.add(new KeplerLabFinal("Pluto", 1.309e22, 39.4821));
...
比方说,我希望搜索半长轴在 2 到 15 之间的任何行星。我已经找到了一个解决方案,使用 for 循环遍历每个条目,然后使用 if 语句来查找我想要的。代码如下:
...
for(KeplerLabFinal planet : planets){
if(planet.getSemiMajorAxis >= 2 && planet.getSemiMajorAxis <= 15){
System.out.println(planet.getPlanetName);
}
}
...
为了减少头痛,这里是组合代码的 pastebin。
最后,如果有人能解释一下冒号在
KeplerLabFinal planet : planets
中的作用/作用,我将不胜感激。我最初使用 for 循环来打印所有行星及其元素,但我从一个不同的片段中得到了它,并将其重新用于我自己的使用。我找到了this,但它并没有准确解释如何它是如何工作的,只是简单地解释了它有用的情况。
在你的主要方法中,你应该使用二分搜索逻辑。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class KeplerLabFinal {
private final String planetName;
private final double planetMass;
private final double semiMajorAxis;
public KeplerLabFinal(String name, double mass, double semiMajorAxis) {
this.planetName = name;
this.planetMass = mass;
this.semiMajorAxis = semiMajorAxis;
}
public static void main(String[] args) {
ArrayList<KeplerLabFinal> planets = new ArrayList<>();
planets.add(new KeplerLabFinal("Mercury", 3.285e23, 0.38710));
planets.add(new KeplerLabFinal("Venus", 4.867e24, 0.72333));
planets.add(new KeplerLabFinal("Earth", 5.972e24, 1));
planets.add(new KeplerLabFinal("Mars", 6.39e23, 1.52366));
planets.add(new KeplerLabFinal("Jupiter", 1.898e27, 5.20336));
planets.add(new KeplerLabFinal("Saturn", 5.683e26, 9.53707));
planets.add(new KeplerLabFinal("Uranus", 8.681e25, 19.1913));
planets.add(new KeplerLabFinal("Neptune", 1.024e26, 30.0690));
planets.add(new KeplerLabFinal("Pluto", 1.309e22, 39.4821));
// Sort the list based on semiMajorAxis
Collections.sort(planets, Comparator.comparingDouble(KeplerLabFinal::getSemiMajorAxis));
// Binary search
int left = 0;
int right = planets.size() - 1;
double lowerBound = 2;
double upperBound = 15;
while (left <= right) {
int mid = left + (right - left) / 2;
KeplerLabFinal planet = planets.get(mid);
if (planet.getSemiMajorAxis() >= lowerBound && planet.getSemiMajorAxis() <= upperBound) {
System.out.println(planet.getPlanetName());
// If you want to find all planets within the range, comment the next line
break;
} else if (planet.getSemiMajorAxis() < lowerBound) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
public String getPlanetName() {
return planetName;
}
public double getSemiMajorAxis() {
return semiMajorAxis;
}
}
使用此代码,这将帮助您针对大型数据集将代码从 O(n) 优化到 O(log n)。