【问题标题】:Using an ArrayList to output perimeters of triangles使用 ArrayList 输出三角形的周长
【发布时间】:2014-05-14 08:08:09
【问题描述】:

我正在尝试编写一个程序,该程序接收三角形的不同边,检查错误以确保它们有效,然后使用 ArrayList 输出它们。

我希望它看起来像这样......

“三角形 t1 的周长是 24。”

"三角形 t2 的周长为 30"

我认为 ArrayList 是我的主要问题(可能还有更多问题)。下面,我只是尽力实现了ArrayList,但显然无法实现。另外,我将如何编写/更改我的 toString 函数,以便它还包含在 main 中创建的对象的名称(即 t1、t2 等)?

感谢收看!

import java.util.*;

public class Tri {

public static void main(String []args){

    Triangle t1 = new Triangle(7, 5, 4);
    Triangle t2 = new Triangle(9, 6, 1);

    System.out.println(t1.perimeter());
    System.out.println(t2.perimeter());

    ArrayList<Triangle>allTriangles = new ArrayList<Triangle>();

}

public static double totalPerimeter( ArrayList<Triangle>a ){

    System.out.println(Arrays.toString( a.toArray()));

    for( int i = 0; i < a.length; i++){

        System.out.println( a.perimeter[i]);

    }
}


class Triangle{

    public Triangle( double a, double b, double c ){

        this.sideA = a;
        this.sideB = b;
        this.sideB = c;

        if (checkSides() == true){}
    }

    public double getA(){
        return sideA;
    }

    public double getB(){
        return sideB;
    }

    public double getC(){
        return sideC;
    }

    public Triangle setA( double a ){

        sideA = a;
        return this;

    }

    public Triangle setB( double b ){

        sideB = b;
        return this;

    }
    public Triangle setC( double c ){

        sideC = c;
        return this;
    }

    public String toString(){

        return "Perimeter of triangle is " + perimeter;
    }

    public double perimeter(){

        if (checkSides() == true)

        perimeter = (sideA+sideB+sideC);
        return perimeter;

    }

private boolean checkSides(){

            if (!(sideA+sideB>sideC) && (sideA+sideC>sideB) && (sideB+sideC>sideA)){
                die("Not valid sides of triangle.");
                return false;
            }

            else return true;

        }

        public void die( String msg ){
            System.err.println( "\nFatal error: " + msg );
            System.exit( 1 );
        }

        private double perimeter;
        private double sideA;
        private double sideB;
        private double sideC;

}

【问题讨论】:

  • 这有什么问题?你能说得更具体点吗?
  • 抱歉,我的问题出在 totalPerimeter 函数中。长度和周长无法解析为字段。
  • 我会推荐这样的迭代:for(Triangle triangle : a){} in totalPerimeter。无需尝试将其作为数组使用。

标签: java class arraylist


【解决方案1】:

你的代码应该是这样的:

        import java.util.*;

        public class Tri {

        public static void main(String []args){

            Triangle t1 = new Triangle(7, 5, 4);
            Triangle t2 = new Triangle(9, 6, 1);

            System.out.println(t1.perimeter());
            System.out.println(t2.perimeter());

            ArrayList<Triangle>allTriangles = new ArrayList<Triangle>();
            allTriangles.add(t1);
            allTriangles.add(t2);

            System.out.println(totalPerimeter(allTriangles));

        }

        public static double totalPerimeter( ArrayList<Triangle>a ){

            double tp = 0.0;

            for(Triangle t : a) {
                System.out.println( "peri : " +  t.perimeter());
                tp += t.perimeter();

            }

            return tp;

        //    for( int i = 0; i < a.length; i++){
        //
        //        System.out.println( a.perimeter[i]);
        //
        //    }
        }


        static class Triangle{

            public Triangle( double a, double b, double c ){

                this.sideA = a;
                this.sideB = b;
                this.sideB = c;

                if (checkSides() == true){}
            }

            public double getA(){
                return sideA;
            }

            public double getB(){
                return sideB;
            }

            public double getC(){
                return sideC;
            }

            public Triangle setA( double a ){

                sideA = a;
                return this;

            }

            public Triangle setB( double b ){

                sideB = b;
                return this;

            }
            public Triangle setC( double c ){

                sideC = c;
                return this;
            }

            public String toString(){

                return "Perimeter of triangle is " + perimeter;
            }

            public double perimeter(){

                if (checkSides() == true)

                perimeter = (sideA+sideB+sideC);
                return perimeter;

            }

        private boolean checkSides(){

                    if (!(sideA+sideB>sideC) && (sideA+sideC>sideB) && (sideB+sideC>sideA)){
                        die("Not valid sides of triangle.");
                        return false;
                    }

                    else return true;

                }

                public void die( String msg ){
                    System.err.println( "\nFatal error: " + msg );
                    System.exit( 1 );
                }

                private double perimeter;
                private double sideA;
                private double sideB;
                private double sideC;
        }
        }

【讨论】:

    【解决方案2】:

    第一个问题:

    我认为 ArrayList 是我的主要问题(可能还有更多 问题)。下面,我只是尽力实现 ArrayList,但是 显然无法得到它。

    好吧,您似乎缺少return 语句,并且您的totalPerimeter(...) 方法存在逻辑问题。您需要确保将总周长添加到变量中,然后返回该变量。此外,ArrayList 使用size() 方法而不是length 来获取列表的长度。此外,您可以使用 get(...) 方法访问 ArrayList 对象。

    public static double totalPerimeter( ArrayList<Triangle>a ){
    
        double total = 0.0; //give default value of 0
    
        for( int i = 0; i < a.size(); i++){
    
            total = total + a.get(i).perimeter(); //add up total
    
        }
        return total;//return it back!
    }
    

    第二个问题:

    另外,我将如何编写/更改我的 toString 函数,以便它可以 还包含在 main 中创建的对象的名称(即 t1、t2、 等等)?

    我认为你做不到。但是,您可以将 String 传递给构造函数:

    private String name;
    
    public Triangle( double a, double b, double c, String variableName){
    
        this.sideA = a;
        this.sideB = b;
        this.sideB = c;
        this.name = variableName;
    
        if (checkSides() == true){}
    }
    

    然后在你的main:

    Triangle t1 = new Triangle(7, 5, 4, "t1");
    Triangle t2 = new Triangle(9, 6, 1, "t2");
    

    然后您可以更新您的toString(...) 方法并访问变量name

    注意:最后要注意的是,当您 checkSides() 时,它会返回 false。您应该 throwException 或给用户一个警告(例如打印出“警告:无效面”)。

    【讨论】:

    【解决方案3】:

    在您的totalPerimeter 函数中:

    1. 由于aArrayList 类型,它没有length 属性。但它确实有一个size() 方法。参考:http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

    2. 由于aArrayList 类型,它没有perimeter 数组字段。您的意思是不是像 a.get(i).perimeter() 这样的东西?

    【讨论】:

      猜你喜欢
      • 2019-10-06
      • 2017-11-01
      • 2015-10-01
      • 2023-01-30
      • 2017-06-21
      • 2017-11-21
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      相关资源
      最近更新 更多