Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java SE 综合讨论区  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
话题被移动
该话题已被移动 - why , 2003-05-15 20:25
如果您尚不清楚该话题被移动的原因,请参考论坛规则以及本版公告或者联系本版版主。
作者 挑战各路JAVA好杰 -- 求最大值:max
nullbi



发贴: 0
积分: 0
于 2003-03-23 01:57 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
首先说明我是一个C++程序员, 其次我不好强也不好斗,我不想挑起事端, 我发此文章只是想了解一下JAVA程序员对一些东西的看法;比如大家大部分都说JAVA要比C++更OO, 是一种OO更纯的语言(相对C++来说), 当然我不否认这一点。

《人月神话》写道:"《没得银弹》被证明富有煽动性的, 它预言十年内没有任何编程技巧能够经软件的生产率带来数据量级上的提高, 十年只剩下一年了,我的预言看来安全了。"这是写于8年前的1995年了,如果我没有记错的话,C++应该是生于1970年代,但C++标准却一直到1998年才定下来,而JAVA出生于1991年, 那么OOP发展到现在,到底会给我们带来怎么样的提高?

我很想请教各位JAVA好手,作为当今世界最为OO的语言 -- JAVA是怎么解决这个简单的问题的:求最大值:max.
当然这不是我提出的问题,这是1995年1月,Scott Meyers在他发表于C++ Report里的一篇名为《min, max and more》[1]的文章里,对C++社群提出了一个挑战。在仔细地分析了基于宏和代表当时模板技术水平的实现后,他得出结论:
  那么究竟什么才是最好的方法——正确的方法——来实现max ?借用Tevye 的不朽名言来说:“我告诉你:我不知道。”面对以上的分析,我越来越觉得我是在告诉人们使用宏的方法可能是最好的,但我讨厌宏。如果你知道max 的一种优雅实现,请告诉我。

据我所知,直至今天这个问题跟N年前一样富有挑战性。各位有请----



作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
rainman

阿熊

元老


发贴: 5644
积分: 454
于 2003-03-23 02:07 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Java里是这样子的:
max = Math.max(a,b)
蛮优雅。




作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
why

問題兒童

总版主


发贴: 4629
积分: 388
于 2003-03-23 09:08 user profilesend a private message to usersend email to whysearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
> 如果我没有记错的话,C++应该是生于1970年代
看怎麼定義「生於」吧。
C 是生於1970年代,而 C++ class 的概念則源自更古早的 Simula67,operator loading 則源自 Algol68,Exception handling 則是1970前後的 Ada 、Clu 和較近期的 ML。純粹從概念的成立而言,C++可算是1970年代的。
但現實中 C++ 的前身,C with classes 應是 1980年後的事,C++ 在1983年才正式出現。

> Java里是这样子的:
> max = Math.max(a,b)
nullbi 所指的是 macro (= 宏?) 的 max,即
#define max(a, b) ((a) > (b) ? (a) : (b))

或 generic, template form, 例如
template <class T>
T& max(T& lhs, T& rhs)
{
return lhs > rhs ? lhs : rhs;
}

Java 沒有 macro,generic 要到 Java 1.5 才可能有,而且和 C++ 的 template 分別不少。而且 Java 也沒有 operator loading,所以不太可能那樣簡潔的 max 和 min,但問題是,有這個需要嗎?
程式語言需要優雅但複雜,還是簡明且實用呢?

Scott Meyers 的 "min, max and more“:
http://aristeia.com/Papers/C++ReportColumns/jan95.pdf



作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:why]
software_young



发贴: 0
积分: 0
于 2003-03-23 10:50 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
所谓“萝卜白菜,各有所爱”,很多事情并没有最佳的解决方法,有的只是偏好、需要和现实的妥协。

我不认为Java是比C++更纯的OO,而觉得Java是C++的简化版,没有了多重继承,没有了那些重载,没有了指针,也没有了模板,什么都是简简单单的,简单到了看看Sun的Tutorial就可以编程序的地步。也许这是Java能够迅速上手的重要原因,也许就是因为这个,微软的C#整个就是抄袭Java,当然类库除外。

就语言的OO程度来讲,Java和C++可以说是各有千秋。Java取消了C++的来源于C的非OO部分,把一个函数森林变成了一棵Object树,但是它同时也取消了C++中那些精妙的地方,没有了多重继承和模板,单靠单一继承加Interface,有些事情的确是难办。JDK 1.5中据说要加上的Generic可以说是对最初Java设计思想的一个反动。反动不一定是坏事,当然也不一定就是好事,像JDK 1.4加上的Assert可以说就是一个败笔。


software_young edited on 2003-03-23 23:52


作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
nullbi



发贴: 0
积分: 0
于 2003-03-23 12:15 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我不知道各位是怎么看待generic的,反正在我项目中template一次又一次的冒出来,我还真不敢想象如果C++没有template这个保留字, 我的

工作量不知要翻N倍.

我对JAVA很感兴趣,在我看来它相对C++来说是一种新的语言,但时间问题,还有现今Java没有generic 诸如此类问题一直在困饶自己, 比如说

没有generic 会使得我像生活在一口井中。

JAVA发展到现在,它是不是开放的?是不是被一家公司控制着,它的标准化工作进行得怎么样了?如果要加入generic ,将会怎么发展?

to rainman :
不知Math.max()的参数是不是double类型的?如果是, 它们是不是对int, float或其它类类型不管用?

to why :
我说的macro 就是你所说的。

template <class T>
T& max(T& lhs, T& rhs)
{
return lhs > rhs ? lhs : rhs;
}
是解决上面rainman碰到的问题, 我自己真的希望JAVA也能够如此优雅地解决掉这个问题。
>>程式語言需要優雅但複雜,還是簡明且實用呢?
任何人都不想複雜不管是客户还是我们。但我们不应该拒绝求一个int 和 一个float两者中的最大者这样一个小小的要求吧?

to software_young :
我认为抄袭也并非全错, 要说抄袭,C##抄袭了JAVA, JAVA抄袭了C++, C++抄袭了Ada 。。。我希望JAVA更胜于C++, C##更胜于JAVA,

我们也欢迎以后那位英雄又创建出胜出C##的K¥¥语言。但事实上是不是后来者JAVA真的完胜C++?



作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
software_young



发贴: 0
积分: 0
于 2003-03-23 23:13 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
在OO世界里,generic是一个重要的方面。在这个方面,SmallTalk做得最好,可惜它不能够商业化。

做到generic有三种方法,一个是SmallTalk那样彻底的,一个是C++那样补充完备的,再一个就是Java目前通过JGL之类软件部分补充的。前者当然是理想的,中者是现实的,而后者则是勉为其难。我的项目必须用Java,但是又大量涉及到generic,因此只好用JGL来弥补,充分领受了夹板气。

相对于微软的东西来说,Java可以说是开放的(我必须这样说,否则从这里收到的板砖足够我盖座大房子的了),但是相对于Unix(各家有各家的,彼此几乎没多少关系),它则不够开放,甚至也比不上Linux的开放程度(根源是一样,但是各个发布商的产品之差别也够可以的)。目前Java的语言,J2SE和J2EE还是被Sun一家公司控制着,语言的标准化不成问题,但是服务器端各个厂商的实现则有相当的区别(不管是描述符还是应用代码),以至于服务器端的应用几乎是不可能跨厂商的(除非你做大量的修改)。

JDK1.5中将会加入的generic的特性,我还不是很清楚。那个版本将是明年的事情,目前还处于Prototype Implementation阶段,无法实用。由于项目压力,我没有时间去关注。

Math.max()可以对应处理double、float、int和long这四种数据类型。

我不是说抄袭不好,而且也不是在说微软的坏话,事实上这里的创始人和斑竹们中的几位很知道我是亲微软的,并为此对我颇有微词。但是应当指出的是,C#和Java实在是太像了,以至于一个熟悉了Java语言的程序员可以非常轻松地熟悉C#;当然C#中的Delegate不是抄的,那是微软的原创,它最初在Visual J++中出现,后来就在.Net的编程语言中借尸还魂了(当然后来的这个做得好多了)。个人认为Delegate是C#相对于Java的一个优势。

我不认为一种语言会完胜另一种语言,问题的关键不在于技术,而在于市场需要。Windows编程技术发展到今天,还有很多人依然在用Win32 API而不用MFC就是明显的例证。同时,C、C++、Java和C#这些语言都在普遍地使用中,很难说谁完胜了谁。


software_young edited on 2003-03-23 23:43


作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
rainman

阿熊

元老


发贴: 5644
积分: 454
于 2003-03-24 00:56 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
>不管是客户还是我们。但我们不应该拒绝求一个int 和 一个float两者中的最大者这样一个小小的要求吧?

这个也没问题啊,做一个强制转换
Math.max((float) i, f)
这样条理清晰啊。

如果要比较日期或者一些自定义的类,在Java中可以使用接口。
就语言来说,Java已经很好用,何况支撑的类库和开发工具也非常丰富。




作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:software_young]
rainman

阿熊

元老


发贴: 5644
积分: 454
于 2003-03-24 01:52 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
software_young wrote:
在OO世界里,generic是一个重要的方面。在这个方面,SmallTalk做得最好,可惜它不能够商业化。

做到generic有三种方法,一个是SmallTalk那样彻底的,一个是C++那样补充完备的,再一个就是Java目前通过JGL之类软件部分补充的。前者当然是理想的,中者是现实的,而后者则是勉为其难。我的项目必须用Java,但是又大量涉及到generic,因此只好用JGL来弥补,充分领受了夹板气。


JGL???? 不知道你是不是真懂哦,JGL只是一个第三方使用STL风格的写法的通用容器和算法类库(现在已经是收费的了,所以我不用)。Java现在已经有Generic的扩展了,做得最好的是:GJ: Generic Java, http://www.research.avayalabs.com/user/wadler/gj/ ,JDK里的容器类库已经全部用GJ重新实现了,来验证泛型Java的健壮,效率。

To nullbi:你可以在上面网站下载源代码来看GJ代码是否优雅。因为使用GJ对JVM不做任何要求,而且GJ Team做得足够好了,所以JDK1.5是否要包括Generic才被提到日程上来讨论。

再回到Max的问题上来:

比如求一个List里元素的最大值,
GJ可以这样写:

interface Comparable<A> {
public int compareTo (A that);
}
class Byte implements Comparable<Byte> {
private byte value;
public Byte (byte value) { this.value = value; }
public byte byteValue () { return value; }
public int compareTo (Byte that) {
return this.value - that.value;
}
}
class Lists {
public static <A implements Comparable<A>> A max (List<A> xs) {
Iterator<A> xi = xs.iterator();
A w = xi.next();
while (xi.hasNext()) {
A x = xi.next();
if (w.compareTo(x) < 0) w = x;
}
return w;
}
}
class TestCase {
public static void main (String[] args) {
// byte collection
LinkedList<Byte> xs = new LinkedList<Byte>();
xs.add(new Byte(0));
xs.add(new Byte(1));
Byte x = Collections.max(xs);
// boolean collection
LinkedList<Boolean> ys = new LinkedList<Boolean>();
ys.add(new Boolean(false));
ys.add(new Boolean(true));
Boolean y = Collections.max(ys); // 这里编译的时候会出错,
// 这样非常好,
//传错参数的可能性就不会有了,
//交给编译器来做检查省时间啊。
}
}


在调用Collections.max(xs)的时候,编译器会检查出参数是class Byte且作了 bound Comparable<Byte>。而调用Collections.max(xs)时的参数是class Boolean,但它并没作bound Comparable<Boolean>。本来在Java 运行期的时候原本會因此抛出异常,但GJ在编译期就指出来了,健壮性加强了!


rainman edited on 2003-03-24 09:48


作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
jacob

Simple is the best!



发贴: 221
积分: 20
于 2003-03-24 13:40 user profilesend a private message to usersend email to jacobsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我想nullbi要求的不是真正的求Max值。
他而是觉得C++用模板来实现对各种数值类型的计算非常方便,来挑战Java有没有这么方便的功能吧?
如果是这样的话,java不需要用模板就能解决这个问题,从Java一出生就能解决,当然在Java1。2以后的方案变得更好。



Thinking with head, Feeling with heart!
作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
nullbi



发贴: 0
积分: 0
于 2003-03-24 23:53 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
Math.max, 看看它的参数表,就可以猜得出它是使用了重载, 那么c, pascal, 以及别的只要支持重载的语言,以同样方法也可以实现:想求int之间最大值,好,来一个 max(int, int), 支持float? 同样一个max(float, float), 那么double也如法炮制,并且它们还能作自动类型转换, 我相信区区三个函数没有谁三分钟搞不定的。但万一我们想比较BigInteger, BigDecimal, string, 日期,时间,还有自定类? 把话题展开来,万一我们要写不是max, 而是一个上百上千行的函数呢,比如实现数据结构中的vector, list , deque, stack, heap, 我们是不是也用这种土枪土炮?

不管你们怎么想,在某种情况下,我觉得Math.max不算一种优雅实现, 并且仅限于比较所能接受的几种参数类型数据。

我们的老板想让我们一人干多人的活,同样我们是不是也希望max能替我们干更多的活呢?



作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
floater

Java Jedi

总版主


发贴: 3233
积分: 421
于 2003-03-25 00:35 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
NP Complete!


"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
- Martin Fowler, Refactoring - Improving the Design of Existing Code
作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
rainman

阿熊

元老


发贴: 5644
积分: 454
于 2003-03-25 03:06 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
nullbi wrote:
Math.max, 看看它的参数表,就可以猜得出它是使用了重载, 那么c, pascal, 以及别的只要支持重载的语言,以同样方法也可以实现:想求int之间最大值,好,来一个 max(int, int), 支持float? 同样一个max(float, float), 那么double也如法炮制,并且它们还能作自动类型转换, 我相信区区三个函数没有谁三分钟搞不定的。但万一我们想比较BigInteger, BigDecimal, string, 日期,时间,还有自定类? 把话题展开来,万一我们要写不是max, 而是一个上百上千行的函数呢,比如实现数据结构中的vector, list , deque, stack, heap, 我们是不是也用这种土枪土炮?

不管你们怎么想,在某种情况下,我觉得Math.max不算一种优雅实现, 并且仅限于比较所能接受的几种参数类型数据。

我们的老板想让我们一人干多人的活,同样我们是不是也希望max能替我们干更多的活呢?


我觉得还好啦,BigInteger等类本身就已经实现了比较。对待类要用OO的方法,i要比较类的大小前面已经说了使用Comparable接口,要找一个list中最大的元素都只是一个API调用,简单方便。如果你什么都要自己来实现而不用现成的类库,似乎有点钻牛角尖。




作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
nullbi



发贴: 0
积分: 0
于 2003-03-25 10:33 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
rainman :
我不知道你有没有理解我的意思, 或者是我们的思维方式不同?
BigInteger等类本身实现了比较, 对啊,我们现在就是要求出max, 对不能实现比较的东西, 我们求max有何意义?
如果你认为使用重载就已经很好的解决了这个问题, 那还是没法说服我.

另外我对钻牛角尖的看法也与你不同, 如果没有钻牛角尖, 说不定我们会用010100111来讨论这个max问题呢 Smile



作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
rainman

阿熊

元老


发贴: 5644
积分: 454
于 2003-03-25 11:03 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
nullbi wrote:
rainman :
我不知道你有没有理解我的意思, 或者是我们的思维方式不同?
BigInteger等类本身实现了比较, 对啊,我们现在就是要求出max, 对不能实现比较的东西, 我们求max有何意义?
如果你认为使用重载就已经很好的解决了这个问题, 那还是没法说服我.

另外我对钻牛角尖的看法也与你不同, 如果没有钻牛角尖, 说不定我们会用010100111来讨论这个max问题呢 Smile


我来写这个max给你看看吧。


public class Util {

public static Object max(Comparable c1,Comparable c2 ) {
return c1.compareTo(c2)>0? c1: c2;
}

}


这个就什么都可以比较了。你得了解什么是java interface先。




作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
nullbi



发贴: 0
积分: 0
于 2003-03-25 11:09 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
另外, 为了不让我们的话题走得太远, 需要说明: max求的就是两者之间的最大者, 找一个list中最大的元素这样的问题我们先放着不谈.


作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
jacob

Simple is the best!



发贴: 221
积分: 20
于 2003-03-28 13:25 user profilesend a private message to usersend email to jacobsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
他不理解,说了也白说


Thinking with head, Feeling with heart!
作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
nullbi



发贴: 0
积分: 0
于 2003-04-04 12:05 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
久没上来, 先粘一帖:

微软C#语言有望标准化 下一代互联网较劲Java
http://www.csdn.net/news/newstopic/10/10403.shtml



作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
mochow

Mary有只小山羊咿呀咿



发贴: 339
积分: 40
于 2003-04-04 21:58 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
nullbi如果真想明白前面的人在说什么,还是看看有关
java接口和多态性的有关资料吧



作者 Re:挑战各路JAVA好杰 -- 求最大值:max [Re:nullbi]
nullbi



发贴: 0
积分: 0
于 2003-04-13 11:26 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
java的同志有些可爱, 怕我不明白各位的思想, 老催我去补接口和多态性的课 Smile



flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923