【问题标题】:Public method outside of public class公共类之外的公共方法
【发布时间】:2018-09-27 22:40:52
【问题描述】:

目标是编写代码来确定最接近 (24,5) 的 x,y 坐标。使用带有 2 个实例变量的公共类 PointXY。然后是类之外的一个公共方法,它返回最接近 (24,5) 的点。我知道我做的不对,因为 PointXY 类型的 ArrayList 让我感到困惑。提前感谢您的帮助。

    public class PointXY {
        private int x;
        private int y;

}

public PointXY closest_24_5(ArrayList<PointXY> b) {
        ArrayList<PointXY> nums = new ArrayList<PointXY>();
        nums.add(new PointXY(3,6));
        int total = Integer.MAX_VALUE;
        for(int i=0; i<nums.size();i++) {
                int dx = 24 - this.x;
                int dy = 5 - this.y;
                int thisDistance = Math.sqrt(dx*dx + dy*dy);
                if(thisDistance<total) {
                    total=thisDistance;
                }
        }
        return total;
}

【问题讨论】:

  • 如果你只是想找到一堆距离中的最小值,你不需要调用Math.sqrt。但是,如果您忽略我的建议并存储实际距离(而不是距离平方),我不建议将其存储在 int 中 - 通常不是。
  • 我认为你应该只是遍历传递给方法的列表,寻找最近的点。无需在方法内部构造自己的ArrayList&lt;PointXY&gt;
  • 好的,你有一个变量来存储你到目前为止找到的最短距离,但是你需要第二个变量来存储你到目前为止找到的最近点。这是因为您的方法实际上需要返回点,只需要返回距离。
  • 我将如何浏览列表?问的问题让我很困惑。它是一个数组列表的数组列表。一个例子是 {[1,3],[2,4],[63,3]}。当做一个for循环来检查这个时,我将如何区分x和y?使用拆分?
  • 原来的任务是:

标签: java class arraylist methods


【解决方案1】:

这是一种可能的方法。向您的 PointXY 类添加一个方法,用于查找到其他点的距离。

public class PointXY {
    private int x;
    private int y;

    public PointXY(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public double distanceTo(PointXY other) {
        return Math.hypot(x - other.x, y - other.y);
    }
}

然后,在某个其他类的代码中,您将能够遍历Collection&lt;PointXY&gt;,寻找最接近某个指定PointXYPointXY。您必须跟踪目前找到的最近点以及到该最近点的距离。

public PointXY closestTo(PointXY target, Collection<PointXY> toChooseFrom) {
    double leastDistanceSoFar = 0;
    PointXY closestPointSoFar = null;
    for (PointXY aPoint : toChooseFrom) {
        double thisDistance = target.distanceTo(aPoint);
        if (closestPointSoFar == null ||  thisDistance < leastDistanceSoFar) {
            closestPointSoFar = aPoint;
            leastDistanceSoFar = thisDistance;
        }
    }

    return closestPointSoFar;
}

【讨论】:

    【解决方案2】:

    您正在使用 Java。 在 Java 中, 只有类; 在类之外什么都不存在。

    如果您有想要共享的代码并且不想为其实例化一个类, 使用静态公共方法。 这是一个例子:

    public class KapowThing
    {
        public static void kapow()
        {
            System.out.println("Kapow");
        }
    }
    
    public class MainThing
    {
        public static void main(final String[] arguments)
        {
            KapowThing.kapow();
        }
    }
    

    编辑 您可以在非公共类中使用公共方法, 但你可能不希望这样,因为非公开课程会有 声明类之外的有限(可能没有)可见性。

    如果班级的访问权限有限, 拥有具有更大访问权限的方法很少有意义(例如在私有类中的公共方法中)。 我唯一可能这样做的情况是,如果我有一个接口和一堆特定于任务的工厂,它们都创建了一个实现该接口的私有类。 我什至不确定这是否可以做到。

    这里还有一些代码:

    package learn.access;
    
    public interface Thingy
    {
        public void sayHello();
    }
    
    
    package learn.access
    
    import learn.access.p1.MakeP1Thingy;
    
    public class Main
    {
        public static void main(String[] args)
        {
            MakeP1Thingy.makeThingy().sayHello();
        }
    }
    
    
    package learn.access.p1;
    
    import learn.access.Thingy;
    
    public class MakeP1Thingy
    {
        public static Thingy makeThingy()
        {
            return new p1Thingy();
        }
    }
    
    package learn.access.p1;
    
    import learn.access.Thingy;
    
    // package access class.
    class p1Thingy implements Thingy
    {
        @Override
        public void sayHello()
        {
            System.out.println("p1 hi");
        }
    }
    

    【讨论】:

    • 我的意思是在公共课 PointXY 之外。因为我仍在 Problem_set 类中编写该方法。
    • 您可以在非公共类中使用公共方法,但您可能不希望这样,因为非公共类在声明类之外的可见性有限(可能没有)。
    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 2020-09-22
    • 2011-04-19
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多