如何在java中通过数组列表搜索特定元素

问题描述 投票:0回答:1

我正在寻找最好的解决方案,我已经有了一个可行的解决方案,但我有兴趣看看是否有更好的解决方案。尽管标题可能另有暗示,但我非常愿意接受不涉及数组列表的解决方案。

我的问题本质上是,有没有一种方法可以在数组中搜索(每次添加都有多个元素)特定的字符串、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,但它并没有准确解释如何它是如何工作的,只是简单地解释了它有用的情况。

java arrays sorting arraylist
1个回答
0
投票

在你的主要方法中,你应该使用二分搜索逻辑。

 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)。

© www.soinside.com 2019 - 2024. All rights reserved.