实现代码很简单:

 
package com.xiaozan.shopping;
 
import java.util.Arrays;
 
public class ShoppingCart {
    
    public final static int PRODUCT_1_PRICE = 2000;    // 产品编号第一个数字为1的单价,单位(分)
    public final static int PRODUCT_2_PRICE = 1000;    // 其他产品编号的单价,单位 (分)
    public final static int PRODUCT_1_TYPE = 1;    // 产品编号第一个数字为1的商品定义为类型1产品
    
    /**
     * 
     * @方法说明 按从小到大排列数组
     * @param data
     * @return void
     */
    public void sort(int[] data) {
        Arrays.sort(data);
    }
    
    /**
     * 
     * @方法说明 传入已排序的数据,计算数组中产品编号第一个数字为1的个数
     * @param data
     * @return
     * @return int
     */
    public int countProduct1(int[] data) {
        int product1Sum = 0;
        for (int i = 0; i < data.length; i++) {
            int theFirstNumber = data[i]/100;    // 产品编号的第一个数字
            if (theFirstNumber == PRODUCT_1_TYPE) {
                // 产品类型1的数量 +1
                product1Sum++;
            } else {
                // 因为已经排序,如果不是产品类型1,则剩余的都不是产品类型1的产品
                return product1Sum;
            }
        }
        return product1Sum;
    }
    
    /**
     * 
     * @方法说明 计算购物车总金额
     * @param data
     * @return
     * @return int
     */
    public int sum(int[] data) {
        int sum = 0;    // 总金额
        sort(data);    // 按从小到大排列产品编号
        int product1Sum = countProduct1(data);    // 类型1产品的个数
        sum = (product1Sum / 4) * (PRODUCT_1_PRICE * 3)    // 买4件类型1的产品只需付3件的钱 
                + (product1Sum % 4) * PRODUCT_1_PRICE     // 不足4件类型1的产品按类型1的产品单价结算
                + (data.length - product1Sum) * PRODUCT_2_PRICE;    // 其他类型的产品按其他类型单价结算
        // 如果折后金额大于等于50元,则全单八折
        if (sum >= 5000) {
            sum *= 0.8;
        }
        return sum;
    }
    
}

个人对测试仍不是很熟练,对Junit的一次练手:
package com.xiaozanoa.shopping;
 
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
 
import java.util.Arrays;
import java.util.Collection;
 
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
 
import com.xiaozan.shopping.ShoppingCart;
 
@RunWith(Parameterized.class)
public class TestShoppingCart {
 
    ShoppingCart shoppingCart = null;
    int[] data = null;    // 预设购物车购买下产品编号
    int[] expectedSort = null;    // 预期的排序结果
    int expectedSum = 0;    // 预期产品总金额
    int expectedProduct1Sum = 0;    // 预期产品1总数
    
    @Parameters
    public static Collection<Object[][]> prepareData() {
        Object[][][] objects = {
                // 含产品1和其他产品,产品1多于4件,金额大于50
                { {229, 132, 129, 217, 190, 118, 387, 124}, 
                  {118, 124, 129, 132, 190, 217, 229, 387}, {5}, {8800} },    
                // 没有产品1 ,金额小于50
                { {229}, {229}, {0}, {1000} },    
                // 没有产品1 ,金额等于50
                { {229, 217, 387, 222, 345}, {217, 222, 229, 345, 387}, {0}, {4000} },    
                // 只有产品1 且少于4件,金额小于50
                { {118}, {118}, {1}, {2000} },    
                // 只有产品1 且等于4件,金额大于50
                { {129, 190, 118, 124}, {118, 124, 129, 190}, {4}, {4800} },    
                // 只有产品1 且大于4件,金额大于50
                { {132, 129, 190, 118, 124}, {118, 124, 129, 132, 190}, {5}, {6400} } };    
        return  Arrays.asList(objects); // 将数组转换成集合返回
    }
    
    public TestShoppingCart(Object[] _data, Object[] _expectedSort, 
            Object[] _expectedProduct1Sum, Object[] _expectedSum) {
        // 构造方法
        // JUnit会使用准备的测试数据传给构造函数
        data = new int[_data.length];
        expectedSort = new int[_expectedSort.length];
        for (int i = 0; i < _data.length; i++) {
            data[i] = (Integer) _data[i];
        }
        for (int i = 0; i < _expectedSort.length; i++) {
            expectedSort[i] = (Integer) _expectedSort[i];
        }
        this.expectedProduct1Sum = (Integer) _expectedProduct1Sum[0];
        this.expectedSum = (Integer) _expectedSum[0];
    }
    
    @Before
    public void setUp() {
        shoppingCart = new ShoppingCart();
    }
    
    @Test
    public void testCountProduct1() {
        int result = shoppingCart.countProduct1(expectedSort);    //计算产品1的数量是在已排序的数组的基础上计算的
        assertEquals(expectedProduct1Sum, result);
    }
    
    @Test
    public void testSort() {
        shoppingCart.sort(data);
        assertArrayEquals(expectedSort, data);
    }
    
    @Test
    public void testSum() {
        int result = shoppingCart.sum(data);
        assertEquals(expectedSum, result);
    }
    
 
}

测试覆盖率:

测试时主要遇到的问题在参数化测试。
常规一般见的参数化例子都是单个数字,如:
@Parameters
public static Collection prepareData()
{
// 测试数据
Object[][] objects = { { 3, 1, 2 }, { -4, -1, -3 }, { 5, 2, 3 },{ 4, -4, 8 } };
return Arrays.asList(objects);// 将数组转换成集合返回
}
所以我在做的时候就想当然的仿照着做:

错误1:argument type mismatch
public TestShoppingCart(int[] _data, int[] _expectedSort, int[] _expectedProduct1Sum, int[] _expectedSum) {
    ……        
}
原因:<Object[][]> List<Object[][]> java.util.Arrays.asList(Object[][]... a),返回的是对象数组

错误2:

Type mismatch: cannot convert from Object[] to int[]

int[] data = null;    // 预设购物车购买下产品编号
int[] expectedSort = null;    // 预期的排序结果
public TestShoppingCart(Object[] _data, Object[] _expectedSort, 
            Object[] _expectedProduct1Sum, Object[] _expectedSum) {
        ……
}

错误3:java.lang.NullPointerException
int[] data = null;    // 预设购物车购买下产品编号

int[] expectedSort = null;    // 预期的排序结果

原因:没有创建对象

错误4:计算的总额与预期的不一致
int[] data = new int[8];    // 预设购物车购买下产品编号

int[] expectedSort = new int[8];    // 预期的排序结果

错误原因:固定了数组大小为8,不足8位,补0填充,这样放到该代码中就有问题了

一分耕耘一分收获…

JAVA面试题——JAVA编程题1(2015.07.22——湛耀)的更多相关文章

  1. Eclipse创建Maven Web项目 + 测试覆盖率 + 常见问题(2015.07.14——湛耀)

    Eclipse创建Maven web项目: 到此,并没有创建好,接下来一步步解决问题: 问题:无法创建src/main/java目录 解决: 右键项目选择[properties] 点击[OK] 问题: ...

  2. 面向对象程序设计--Java语言第二周编程题:有秒计时的数字时钟

    有秒计时的数字时钟 题目内容: 这一周的编程题是需要你在课程所给的时钟程序的基础上修改而成.但是我们并不直接给你时钟程序的代码,请根据视频自己输入时钟程序的Display和Clock类的代码,然后来做 ...

  3. [ Java面试题 ]Java 开发岗面试知识点解析

    如背景中介绍,作者在一年之内参加过多场面试,应聘岗位均为 Java 开发方向. 在不断的面试中,分类总结了 Java 开发岗位面试中的一些知识点. 主要包括以下几个部分: Java 基础知识点 Jav ...

  4. C/C++笔试题(编程题)

    面试过程中遇到的编程题整理,于此备录.分享,共勉.(持续更新中......欢迎补充) (1)用户输入M, N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出.写出C程序. 程序代码如下: ...

  5. JAVA面试题——JAVA编程题1(2015.07.22)

    实现代码很简单:   package com.xiaozan.shopping;   import java.util.Arrays;   public class ShoppingCart {    ...

  6. Java笔试题解析(二)——2015届唯品会校招

    曾经总是看别人写的笔经面经.今天自己最终能够写自己亲身经历的一篇了 T-T. 前阵子去了唯品会的秋招宣讲会,华工场(如今才知道原来找家互联网公司工作的人好多).副总裁介绍了VIP的商业模式是逛街式的购 ...

  7. java基础50道编程题

    50道JAVA基础编程练习题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析 ...

  8. java面试之常见编程题

    1.编程实现:二分搜索算法 解答: public class SearchTest { /** 被搜索数据的大小 */ private static final int size = 5000000; ...

  9. Java笔试题-线程编程方面

      Ja 线程编程方面 60.java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现R ...

随机推荐

  1. 第四章 Web表单

    4.1 跨站请求伪造保护 安装flask-wtf app = Flask(__name__) app.config['SECRET_KEY'] = 'hard to guess string' 密钥不 ...

  2. 【prism】前期准备

    在网上下了prism框架源码,目前最新版本为4.1,其中包含的内容如下: 其中包含三类文件: 1.类似于Desktop only-Prism Library.bat的批处理文件,用来打开相应的Pris ...

  3. 在jsp中运用ajax实现同一界面不跳转处理事件

    目前,编写应用程序时有两种基本的选择: 桌面应用程序 Web应用程序 它们有什么区别呢?桌面应用程序一般很快(就在您的计算机上运行,不用等待互联网连接),具有漂亮的用户界面(通常和操作系统有关)和非凡 ...

  4. 4、Hbase

    1).逻辑模型 Hbase 以表的形式存储数据,每个表由行和列组成,每个列属于一个特定的列族. 表中由行和列确定的存储单元称为一个元素,每个元素保存了同一份数据的多个版本,由时间戳来标识.行健是数据行 ...

  5. OFBiz之SVN下载地址

    trunk: $ svn co http://svn.apache.org/repos/asf/ofbiz/trunk ofbiz release13.07: $ svn co http://svn. ...

  6. unity的旋转

    绕着一个点旋转 : transform.RotateAround(Vector3.zero, Vector3.up, speed* Time.deltaTime ); 第一个参数,点的位置.第二个参数 ...

  7. JAVA 内存管理总结

    1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对 ...

  8. Python按照索引访问list

    由于list是一个有序集合,所以,我们可以用一个list按分数从高到低表示出班里的3个同学: >>> L = ['Adam', 'Lisa', 'Bart'] 那我们如何从list中 ...

  9. RadioGroup 的 RadioButton 选择改变字体颜色和背景颜色

    RadioGroup <RadioGroup android:id="@+id/client_charge_radiogroup" android:layout_width= ...

  10. Nagios 邮箱告警的方式太OUT了!

    一般来讲,在安装完 Nagios 后,我们做的第一件最正确的事,就是设置它的邮件通知,对吧.因为如果没有这一步骤的话,你怎么能够知道什么时候会出现问题呢? 伴随着成功的初始安装,你即将是你司唯一一个能 ...