2014年11月17日星期一

3)Java容器 - weilf

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
3)Java容器 - weilf  阅读原文»

3)Java容器
Java的集合框架核心主要有三种:List、Set和Map。
这里的 Collection、List、Set和Map都是接口(Interface)。 List lst = new ArrayList(); 这是我们平常经常使用的创建一个新的List的语句,在这里, List是接口,ArrayList才是具体的类。
常用集合类的继承结构如下:
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<--TreeSet
Map<--TreeMap
Map<--HashMap
下面的表格是各个容器的特性一览表:
Collection/Map
接口
成员重复性
元素存放顺序( Ordered/Sorted
元素中被调用的方法
基于那中数据结构来实现的
HashSet
Set
Unique elements
No order
equals()
hashCode()
Hash
LinkedHashSet
Set
Unique elements
Insertion order
equals()
hashCode()
Hash 表和双向链表
TreeSet
SortedSet
Unique elements
Sorted
equals()
compareTo()
平衡树(Balanced tree
ArrayList
面试题-分解质因数 - 漫步枫  阅读原文»

题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。
(2)如果n <> k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。
(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

网上这道题一搜就能找到,但是我看到的一个答案是这样的:

1 import java.util.Scanner;
2
3 public class lianxi04 {
4 public static void main(String[] args) {
5 Scanner s = new Scanner(System.in);
6 System.out.print("请键入一个正整数: ");
7 int n = s.nextInt();
8 int k = 2;
9 System.out.print(n + "=");
10 while (k <= n) {
11 if (k == n) {
12 System.out.println(n);
13 break;
14 } else if (n % k == 0) {
15 System.out.print(k + "*");
16 n = n / k;
17 } else {
18 k++;
19 }
20 }
21 }
22 }

这道题本身并没有什么难度,只要思路对了无论使用递归还是循环都可以解决。顺便说一下解题思路吧。接受一个输入的数字,就是被分解的数字(num),最小的质子数是2,然后num除以2,如果可以整除,2就是一个质因数,如果不可以2+1,再拿num除以进行整除判断。对所得的质因数输出。

这么写当然是可以得出正确答案的,但是想一想,这样的代码好吗?

以上代码有以下几点不好的地方:

1、 所有代码都写到了main中,这个是很不好的习惯,main方法一般就是做启动jvm用的不应该含有业务逻辑;

2、 请接受一个用户输入的数字从控制台接收,如果这个输入的数据是从一个界面或者网络来的,那这个程序不是得整体改动,获取处理数据应该是有一个方法封装。

3、 从控制台接收数据,获得的数据类型是int,但是以上程序在输入a这样的非int数据会抛异常,没有做异常处理,这个异常打印很不友好;

4、 分解质因数这个功能应该也算是一个算法,这个算法为了能够被可重复使用,需要进行封装;

5、 同理输出的方法也应该需要进行封装,题目虽然是输出道控制台,但是如果哪天需求变动,不是惨了。(该死的需求总是在变,大家应该都有体会);

6、 变量的命名:n,k谁能理解这个是什么意思啊。

下面是我对这道题解答的改进:

涉及五个类:

PrimeHandle:分解质因数处理类,核心算法

Input:获取输入数据的接口

ConsoleInput:从控制台输入数据的Input接口实现

Output:输出结果的接口

ConsoleOutput:从控制台输出结果的Output接口实现

Main:客户端程序,用于执行程序

上代码:

1 public class PrimeHandle {
2
3 //用于存放结果
4 private List<Integer> results = new ArrayList<Integer>();
5 //需要处理的数字
6 private int handleNum;
7 //最小的质子数
8 private static final int minPrime = 2;
9
10 PrimeHandle(int handleNum){
11 this.handleNum = handleNum;
12

阅读更多内容

没有评论:

发表评论