Java 搜索对象的阵列列表

Java 搜索对象的阵列列表,java,search,arraylist,Java,Search,Arraylist,对于我当前的项目,我必须搜索ZipCode对象的ArrayList,以便从用户输入的int-zip中找到最远的ZipCode 以下是编写我遇到问题的方法的说明: public ZipCode findFurthest(int-pZip)-查找距离提供的邮政编码最远的ZipCode。如果未找到邮政编码,则返回null。例如,距离邮政编码75234最远的是阿达克,AK 99546 在我的代码中,我使用公共int-distance(int-zip1,int-zip2)方法来计算用户输入的zip和Arr

对于我当前的项目,我必须搜索ZipCode对象的ArrayList,以便从用户输入的int-zip中找到最远的ZipCode

以下是编写我遇到问题的方法的说明: public ZipCode findFurthest(int-pZip)-查找距离提供的邮政编码最远的ZipCode。如果未找到邮政编码,则返回null。例如,距离邮政编码75234最远的是阿达克,AK 99546

在我的代码中,我使用公共int-distance(int-zip1,int-zip2)方法来计算用户输入的zip和ArrayList对象的zip之间的距离。我不知道如何编写正确的if语句以找到最远的ZipCode。 谢谢你的帮助,我非常感激

public class ZipCodeDatabase {

    private ArrayList<ZipCode> list;

    /**
     * Constructor for objects of class ZipCodeDatabase
     */
    public ZipCodeDatabase()
    {
        // initialise instance variables
        list = new ArrayList<ZipCode>();
    }

    /**
     * Method findZip searches loops through the ArrayList and returns all of the ZipCodes
     * 
     * @param  int zip
     * @return     null
     */
    public ZipCode findZip(int zip)
    {
        // put your code here

        for(ZipCode z : list){
            if(z.getZip() == zip){
                return z;   
            }

        }
        return null;
    }

    /**
     * Method distance calculates the distance between two user entered zip codes numbers
     * 
     * @param  int zip1, int zip2
     * @return int
     */
    public int distance(int zip1, int zip2){   

        ZipCode z1 = new ZipCode(zip1);
        ZipCode z2 = new ZipCode(zip2);
        z1 = findZip(zip1);
        z2 = findZip(zip2);

        double lat1 = z1.getLat();
        double lat2 = z2.getLat();
        double lon1 = z1.getLon();
        double lon2 = z2.getLon();
        final int EARTH_RADIUS = 3959;
        if(list.contains(z1) && list.contains(z2)){
            double p1= Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lon1))
                * Math.cos(Math.toRadians(lat2)) * Math.cos(Math.toRadians(lon2));

            double p2 = Math.cos(Math.toRadians(lat1)) * Math.sin(Math.toRadians(lon1))
                * Math.cos(Math.toRadians(lat2)) * Math.sin(Math.toRadians(lon2));

            double p3 = Math.sin(Math.toRadians(lat1)) * Math.sin(Math.toRadians(lat2));

            double distance = Math.acos(p1 + p2 + p3) * EARTH_RADIUS;

            double d = distance;

            int dist = (int) d;

            return dist;
        }
        else{
            return -1; 
        }

    }

    /**
     * Method withinRadius finds all of the ZipCode objects within the radius of the entered 
     * zip
     * @param  int pZip, int pRadius
     * @return list
     */
    public ArrayList<ZipCode> whithinRadius(int pZip, int pRadius){

        for(ZipCode z: list){
            if(distance(pZip, z.getZip()) <= pRadius){
                ArrayList<ZipCode> radius = new ArrayList<>();
                radius.add(z);
                return radius;
            }
            else{
                ArrayList<ZipCode> radius = new ArrayList<>();
            }
        }   
        return list;
    }

    /**
     * Method findFurthest finds the furthest ZipCode from the user entered zip
     * 
     * @param  int pZip
     * @return null
     */
    public ZipCode findFurthest(int pZip){

        if(list.contains(pZip)){

            for(ZipCode z : list){
                if(distance(pZip, z.getZip()) < distance(pZip, z.getZip())){
                    return z;
                }

            }

        }
        return null;
    }

    /**
     * Method search find all of the ZipCode objects with a city name that contains the user 
     * entered string
     * @param  String str
     * @return list
     */
    public ArrayList<ZipCode> search(String str){
        ArrayList<ZipCode> matchStr = new ArrayList<>();
        for(ZipCode z : list){
            if(z.getCity().contains(str)){

                matchStr.add(z);
                return matchStr;
            }
            else{

                return matchStr;
            }

        }
        return list;
    }

    /**
     * Method readZipCodeDatabase reads the file containing all of the zip codes
     * 
     * @param  String filename
     * @return int
     */
    public void readZipCodeData(String filename){

        Scanner inFS = null;
        FileInputStream fileByteStream = null;
        try{
            //open the file and set delimeters
            fileByteStream = new FileInputStream(filename);
            inFS = new Scanner(fileByteStream);
            inFS.useDelimiter("[,\r\n]+");
            filename = "zipcodes.txt";
            // continue while there is more data to read
            while(inFS.hasNext()) {

                // read five data elements
                int zip = inFS.nextInt();
                String city = inFS.next();
                String state = inFS.next();
                double lat = inFS.nextDouble();
                double lon = inFS.nextDouble();
                ZipCode z = new ZipCode(zip, city, state, lat, lon);
                ArrayList<ZipCode> list = new ArrayList<>(); 
                list.add(z);
            }
            fileByteStream.close();
            //error while reading the file
        }catch(IOException error1){
            System.out.println("Error: Unable to read file: " + filename);
        }
    }
}
公共类ZipCode数据库{
私有数组列表;
/**
*类ZipCodeDatabase的对象的构造函数
*/
公共ZipCodeDatabase()
{
//初始化实例变量
列表=新的ArrayList();
}
/**
*方法findZip在ArrayList中搜索循环并返回所有ZipCodes
* 
*@param int-zip
*@returnnull
*/
公共ZipCode findZip(int-zip)
{
//把你的代码放在这里
用于(ZipCode z:列表){
if(z.getZip()==zip){
返回z;
}
}
返回null;
}
/**
*方法距离计算两个用户输入的邮政编码之间的距离
* 
*@param int zip1,int zip2
*@return int
*/
公共整数距离(整数zip1,整数zip2){
ZipCode z1=新ZipCode(zip1);
ZipCode z2=新ZipCode(zip2);
z1=findZip(zip1);
z2=findZip(zip2);
双lat1=z1.getLat();
双lat2=z2.getLat();
双lon1=z1.getLon();
双lon2=z2.getLon();
最终int接地半径=3959;
if(列表包含(z1)和列表包含(z2)){
双p1=Math.cos(Math.toRadians(lat1))*Math.cos(Math.toRadians(lon1))
*Math.cos(Math.toRadians(lat2))*Math.cos(Math.toRadians(lon2));
double p2=Math.cos(Math.toRadians(lat1))*Math.sin(Math.toRadians(lon1))
*Math.cos(Math.toRadians(lat2))*Math.sin(Math.toRadians(lon2));
double p3=Math.sin(Math.toRadians(lat1))*Math.sin(Math.toRadians(lat2));
双距离=数学acos(p1+p2+p3)*地球半径;
双d=距离;
int dist=(int)d;
返回距离;
}
否则{
返回-1;
}
}
/**
*withinRadius方法查找输入的对象半径内的所有ZipCode对象
*拉链
*@param int pZip,int pRadius
*@返回列表
*/
公共阵列列表whithinRadius(内普齐普,内普拉迪乌斯){
用于(ZipCode z:列表){

if(distance(pZip,z.getZip())这个代码段应该可以做到:

public ZipCode findFurthest(int pZip)
{
    return list.stream()
        .max((zip0, zip1) -> distance(pZip, zip0.getZip())
            - distance(pZip, zip1.getZip()))
        .orElse(null);
}

这没什么特别的-只是一个常规的最小-最大代码。请编写测试来检查此方法是否真的有效。

您的FindFurtest方法是比较表达式两侧相同的计算距离if(distance(pZip,z.getZip())