- 浏览: 85759 次
- 性别:
- 来自: 北京
最新评论
-
hkliya:
itway 写道非常感谢,谢谢不客气,有用就好。另外,博客已转 ...
adsl拨号命令 -
itway:
非常感谢,谢谢
adsl拨号命令 -
just_zx:
Linux下最好的开源查字字典:Openyoudao Ope ...
使用linux下的词典StarDic -
wangheid:
Mybeautiful 写道下半年将5公里控制在20分钟内。
...
程序员要锻炼好身体 -
Mybeautiful:
下半年将5公里控制在20分钟内。已经相当快了啊,速度是 6.6 ...
程序员要锻炼好身体
ddddddd
*********************************************************************
不 要 过 度 设 计!
*********************************************************************
无聊了不得找点乐子吗
其实你现在逛论坛看贴回贴不也是在将简单的问题复杂化?
我从来不认为只有Java的规范才是OO而C++的写法就不是OO。OO是一种思想,就像Java中的接口;而Java,C++,甚至JavaScript等语言都是OO的一种实现,就像实现了某个接口的具体的类。OO实现起来每种语言都不一样。
关于那个light,其实您只是用Java的一些所谓的规范来认定OO,您没有想过什么才是OO。而且,我认为编程是件很自由的事,如果一定要遵循某种规范的话,那让机器写代码好了。为什么语言的设计者都会留很多并不规范的余地呢,不就是让程序员更自由吗?
同意,感觉这么做意思不太大。根据需求来设计比较好。没必要吧简单的问题搞那么复杂
C++没什么不好的啊,C++也是OO的。Java不也是从c++发展过来的吗?刚学Java,觉得Java规范太多,C++灵活些。我觉得我写的很像Java。等号两边加不加空格,if语句怎么写这完全是个人习惯,无关大局,有必要争论吗?
谢谢批评
第一个问题,我这里不就是counter通知king吗?我并没有让king去主动查询哦
第二个问题在第二版代码里改用继承了
第三个问题,国王不是应该知道100个犯人在哪里吗?不知道的话怎么去控制他们玩游戏呢?
第四个问题,本来就是来show的。。。
第五个问题,已经说的不少了,非常感谢!
这个单线程程序为什么要搞这么多 synchronized方法啊
isStatus()这个方法名字不太好
呵呵。。习惯了写web程序了。。isXX也是相当说javabean...getXX
这个单线程程序为什么要搞这么多 synchronized方法啊
isStatus()这个方法名字不太好
这位大大,两种写法的意义和效果都是完全一样的呀
public class A {
public void b() { for (;;) ; }
public void c() { while(true) ; }
}
出来的b和c的字节码是完全一样的
是哦,我也测试了一下,应该是编译期优化的结果吧
javap -c For结果是:
- Prison.rar (10.8 KB)
- 下载次数: 45
- Prison1.1.rar (326.4 KB)
- 下载次数: 79
评论
77 楼
metaphy
2010-01-16
*********************************************************************
不 要 过 度 设 计!
*********************************************************************
76 楼
boyxuper
2010-01-16
<pre><span style="font-family: tahoma,arial,helvetica,sans-serif;">...重新算了下
(100) + 99/99 + 100 + 99/98 + 100 + ... =
512.560374 + 9900 = 10412.56374/10512.56374<br>28.527571890410958904109589041096/28.801544493150684931506849315068年
我实在无法想象的是第一个操作灯的普通囚犯</span><span><span style="font-family: tahoma,arial,helvetica,sans-serif;">28年除了第一天按下了开关之后的28年怎么过的
</span></span><span style="font-family: tahoma,arial,helvetica,sans-serif;">代码来说我支持这位的...</span></pre>
<div class="quote_title">guxiao05 写道</div>
<div class="quote_div">
<p>已经失业半年的</p>
<p>===================================</p>
<p>灯</p>
<pre name="code" class="java">package justforfun;
public class Light {
private static Light _light; // 电灯
private boolean _state; // 电灯的状态
private Light() {
_state = false; // 默认是关闭的
}
public static Light creatLight() {
if (_light == null) {
_light = new Light();
}
return _light;
}
public void open() {
_state = true;
}
public void close() {
_state = false;
}
public boolean isOpen() {
return _state;
}
}
</pre>
<p> 犯人</p>
<pre name="code" class="java">package justforfun;
import java.util.Observable;
public class Prisoner extends Observable {
protected int _no; // 犯人的编号
private boolean _operationFlag; // 是否进行过操作
public Prisoner(int no) {
_no = no;
_operationFlag = false;
}
public void operation(Light light) {
if (!_operationFlag && !light.isOpen()) {
light.open();
_operationFlag = true;
}
}
public static Counter upgradeToCounter(Prisoner prisoner, int size) {
return new Counter(prisoner._no, size);
}
}
</pre>
<p> 计数者</p>
<pre name="code" class="java">package justforfun;
public class Counter extends Prisoner {
private int _count = 0; // 关灯的次数
private int _maxCount; // 监狱中罪犯的人数
public Counter(int no, int maxCount) {
super(no);
_maxCount = maxCount;
}
@Override
public void operation(Light light) {
if (light.isOpen()) {
light.close();
_count++;
if (isEnd()) {
setChanged();
notifyObservers("所有的犯人都出来放过风了");
}
}
}
private boolean isEnd() {
return _count == _maxCount - 1;
}
}
</pre>
<p> </p>
<p>监狱</p>
<pre name="code" class="java">package justforfun;
import java.util.ArrayList;
import java.util.List;
public class Prison {
private List<Prisoner> _prison; // 监狱
private int _size; // 监狱大小
private static final int INIT_SIZE = 100; // 监狱初始大小为100
public Prison() {
this(INIT_SIZE);
}
public Prison(int size) {
_size = size;
_prison = new ArrayList<Prisoner>(_size);
}
public boolean addPrisoner(Prisoner prisoner) {
if (_prison.size() >= _size) {
throw new RuntimeException("监狱已满!请申请扩建。");
} else {
_prison.add(prisoner);
return true;
}
}
public void replacePrisoner(Prisoner prisoner) {
_prison.set(prisoner._no, prisoner);
}
public Prisoner getPrisoner(int no) {
if (no > _prison.size()) {
throw new RuntimeException("对不起!没有你要找的人。");
} else {
return _prison.get(no);
}
}
public int getPrisonSize() {
return _prison.size();
}
}
</pre>
<p> </p>
<p>国王</p>
<pre name="code" class="java">package justforfun;
import java.util.Observable;
import java.util.Observer;
import java.util.Random;
public class King implements Observer {
boolean isEnd = false; // 是否结束
public static final int PRISON_SIZE = 100;
public static void main(String[] args) {
King king = new King();
Prison prison = initPrison(king);
meeting(king, prison); // 犯人们在开会
int day = start(king, prison);
System.out.println("过去了" + day / 365 + "年" + day % 365 + "天, 犯人们都解放了");
}
private static int start(King king, Prison prison) {
Light light = Light.creatLight();
// 无尽的日子开始了...
int day = 0;
while (!king.isEnd) {
// 煎熬中...
prison.getPrisoner(new Random().nextInt(PRISON_SIZE)).operation(
light);
day++;
}
return day;
}
// 先抓点犯人扔进监狱
private static Prison initPrison(King king) {
Prison prison = new Prison(PRISON_SIZE);
for (int i = 0; i < PRISON_SIZE; i++) {
Prisoner prisoner = new Prisoner(i);
prisoner.addObserver(king);
prison.addPrisoner(prisoner);
}
return prison;
}
private static void meeting(King king, Prison prison) {
Prisoner specialPrisoner = prison.getPrisoner(new Random()
.nextInt(PRISON_SIZE)); // 选出一个犯人
specialPrisoner = Prisoner.upgradeToCounter(specialPrisoner, prison
.getPrisonSize()); // 犯人升级为计数者
specialPrisoner.addObserver(king);
prison.replacePrisoner(specialPrisoner);
}
// 接收来自犯人的通知
@Override
public void update(Observable prisoner, Object content) {
System.out.println(content);
isEnd = true;
}
}
</pre>
<p> </p>
</div>
<p> </p>
(100) + 99/99 + 100 + 99/98 + 100 + ... =
512.560374 + 9900 = 10412.56374/10512.56374<br>28.527571890410958904109589041096/28.801544493150684931506849315068年
我实在无法想象的是第一个操作灯的普通囚犯</span><span><span style="font-family: tahoma,arial,helvetica,sans-serif;">28年除了第一天按下了开关之后的28年怎么过的
</span></span><span style="font-family: tahoma,arial,helvetica,sans-serif;">代码来说我支持这位的...</span></pre>
<div class="quote_title">guxiao05 写道</div>
<div class="quote_div">
<p>已经失业半年的</p>
<p>===================================</p>
<p>灯</p>
<pre name="code" class="java">package justforfun;
public class Light {
private static Light _light; // 电灯
private boolean _state; // 电灯的状态
private Light() {
_state = false; // 默认是关闭的
}
public static Light creatLight() {
if (_light == null) {
_light = new Light();
}
return _light;
}
public void open() {
_state = true;
}
public void close() {
_state = false;
}
public boolean isOpen() {
return _state;
}
}
</pre>
<p> 犯人</p>
<pre name="code" class="java">package justforfun;
import java.util.Observable;
public class Prisoner extends Observable {
protected int _no; // 犯人的编号
private boolean _operationFlag; // 是否进行过操作
public Prisoner(int no) {
_no = no;
_operationFlag = false;
}
public void operation(Light light) {
if (!_operationFlag && !light.isOpen()) {
light.open();
_operationFlag = true;
}
}
public static Counter upgradeToCounter(Prisoner prisoner, int size) {
return new Counter(prisoner._no, size);
}
}
</pre>
<p> 计数者</p>
<pre name="code" class="java">package justforfun;
public class Counter extends Prisoner {
private int _count = 0; // 关灯的次数
private int _maxCount; // 监狱中罪犯的人数
public Counter(int no, int maxCount) {
super(no);
_maxCount = maxCount;
}
@Override
public void operation(Light light) {
if (light.isOpen()) {
light.close();
_count++;
if (isEnd()) {
setChanged();
notifyObservers("所有的犯人都出来放过风了");
}
}
}
private boolean isEnd() {
return _count == _maxCount - 1;
}
}
</pre>
<p> </p>
<p>监狱</p>
<pre name="code" class="java">package justforfun;
import java.util.ArrayList;
import java.util.List;
public class Prison {
private List<Prisoner> _prison; // 监狱
private int _size; // 监狱大小
private static final int INIT_SIZE = 100; // 监狱初始大小为100
public Prison() {
this(INIT_SIZE);
}
public Prison(int size) {
_size = size;
_prison = new ArrayList<Prisoner>(_size);
}
public boolean addPrisoner(Prisoner prisoner) {
if (_prison.size() >= _size) {
throw new RuntimeException("监狱已满!请申请扩建。");
} else {
_prison.add(prisoner);
return true;
}
}
public void replacePrisoner(Prisoner prisoner) {
_prison.set(prisoner._no, prisoner);
}
public Prisoner getPrisoner(int no) {
if (no > _prison.size()) {
throw new RuntimeException("对不起!没有你要找的人。");
} else {
return _prison.get(no);
}
}
public int getPrisonSize() {
return _prison.size();
}
}
</pre>
<p> </p>
<p>国王</p>
<pre name="code" class="java">package justforfun;
import java.util.Observable;
import java.util.Observer;
import java.util.Random;
public class King implements Observer {
boolean isEnd = false; // 是否结束
public static final int PRISON_SIZE = 100;
public static void main(String[] args) {
King king = new King();
Prison prison = initPrison(king);
meeting(king, prison); // 犯人们在开会
int day = start(king, prison);
System.out.println("过去了" + day / 365 + "年" + day % 365 + "天, 犯人们都解放了");
}
private static int start(King king, Prison prison) {
Light light = Light.creatLight();
// 无尽的日子开始了...
int day = 0;
while (!king.isEnd) {
// 煎熬中...
prison.getPrisoner(new Random().nextInt(PRISON_SIZE)).operation(
light);
day++;
}
return day;
}
// 先抓点犯人扔进监狱
private static Prison initPrison(King king) {
Prison prison = new Prison(PRISON_SIZE);
for (int i = 0; i < PRISON_SIZE; i++) {
Prisoner prisoner = new Prisoner(i);
prisoner.addObserver(king);
prison.addPrisoner(prisoner);
}
return prison;
}
private static void meeting(King king, Prison prison) {
Prisoner specialPrisoner = prison.getPrisoner(new Random()
.nextInt(PRISON_SIZE)); // 选出一个犯人
specialPrisoner = Prisoner.upgradeToCounter(specialPrisoner, prison
.getPrisonSize()); // 犯人升级为计数者
specialPrisoner.addObserver(king);
prison.replacePrisoner(specialPrisoner);
}
// 接收来自犯人的通知
@Override
public void update(Observable prisoner, Object content) {
System.out.println(content);
isEnd = true;
}
}
</pre>
<p> </p>
</div>
<p> </p>
75 楼
hkliya
2010-01-16
night_stalker 写道
这是 Class Oriented ……
硬是把智力题歪成编程题,脑子里一大堆伪需求,早就 lose 了。
硬是把智力题歪成编程题,脑子里一大堆伪需求,早就 lose 了。
无聊了不得找点乐子吗
其实你现在逛论坛看贴回贴不也是在将简单的问题复杂化?
74 楼
红楼一梦
2010-01-16
linhong_1001 写道
代码不规范就是不规范,不规范成了习惯也不能期望一下子就规范,C++很好,可是要是你要那个java去写C++似的代码那我觉得你还是继续C++,而且就算是C++这也不像啊,C++也讲代码规范。OO是否,跟你用C++或Java没什么关心,只是你的肯定不OO.
public static boolean light
这样的东西,有Class不能就说是OO吧
public static boolean light
这样的东西,有Class不能就说是OO吧
我从来不认为只有Java的规范才是OO而C++的写法就不是OO。OO是一种思想,就像Java中的接口;而Java,C++,甚至JavaScript等语言都是OO的一种实现,就像实现了某个接口的具体的类。OO实现起来每种语言都不一样。
关于那个light,其实您只是用Java的一些所谓的规范来认定OO,您没有想过什么才是OO。而且,我认为编程是件很自由的事,如果一定要遵循某种规范的话,那让机器写代码好了。为什么语言的设计者都会留很多并不规范的余地呢,不就是让程序员更自由吗?
73 楼
cs_zhao
2010-01-16
public class Game { private static final int COUNT_OF_PRISONERS = 100; private Light light; private Prisoner[] prisoners; private int day; public void start() { init(); while (true) { Prisoner prisoner = prisoners[(int)(Math.random()*COUNT_OF_PRISONERS)]; prisoner.freely(light); if (prisoner instanceof Counter) { if (((Counter) prisoner).isfinish(COUNT_OF_PRISONERS)) { break; } } day++; } System.out.println(day / 365); } private void init() { light = new Light(); addPrisoners(); setCounter(); } private void addPrisoners() { prisoners = new Prisoner[COUNT_OF_PRISONERS]; for (int i = 0; i < COUNT_OF_PRISONERS; i++) { prisoners[i] = new Prisoner(); } } private void setCounter() { int randNum = (int)(Math.random()*COUNT_OF_PRISONERS); prisoners[randNum] = new Counter(); } public static void main(String[] args) { new Game().start(); } }
public class Prisoner { private boolean turnOnLight = false; public void freely(final Light light){ if(turnOnLight||light.isOpen()){ return ; } light.turnOn(); } }
public class Counter extends Prisoner { private int count = 0; @Override public void freely(final Light light) { if(light.isOpen()){ light.turnOff(); count++; } } public boolean isfinish(int prisonerNum){ return count == prisonerNum-1; } }
public class Light { private boolean open ; public void turnOn(){ open = true; } public void turnOff(){ open = false; } public boolean isOpen(){ return open; } }
72 楼
shadowlin
2010-01-16
night_stalker 写道
这是 Class Oriented ……
硬是把智力题歪成编程题,脑子里一大堆伪需求,早就 lose 了。
硬是把智力题歪成编程题,脑子里一大堆伪需求,早就 lose 了。
同意,感觉这么做意思不太大。根据需求来设计比较好。没必要吧简单的问题搞那么复杂
71 楼
night_stalker
2010-01-16
这是 Class Oriented ……
硬是把智力题歪成编程题,脑子里一大堆伪需求,早就 lose 了。
硬是把智力题歪成编程题,脑子里一大堆伪需求,早就 lose 了。
70 楼
linhong_1001
2010-01-16
代码不规范就是不规范,不规范成了习惯也不能期望一下子就规范,C++很好,可是要是你要那个java去写C++似的代码那我觉得你还是继续C++,而且就算是C++这也不像啊,C++也讲代码规范。OO是否,跟你用C++或Java没什么关心,只是你的肯定不OO.
public static boolean light
这样的东西,有Class不能就说是OO吧
public static boolean light
这样的东西,有Class不能就说是OO吧
69 楼
红楼一梦
2010-01-16
linhong_1001 写道
不知道是怎么个好法?是若是OO,第一种稍微强点,可是代码中那么多废话也要命。还有那个老是C++什么的,现在又不是在C++,既然要写java就像点java。
C++没什么不好的啊,C++也是OO的。Java不也是从c++发展过来的吗?刚学Java,觉得Java规范太多,C++灵活些。我觉得我写的很像Java。等号两边加不加空格,if语句怎么写这完全是个人习惯,无关大局,有必要争论吗?
68 楼
hkliya
2010-01-16
mxswl 写道
楼主,我猜你只有半年实际JAVA经验.
OO思维比较乱.看了你的代码大约一分钟左右,随便列以下几点不足.
1.任务的完成,counter通知king为妙,而不是king主动轮询. 或许以后关心有没放风完的不止king一个人,还有queen...等
2.100个人中只有一个是counter,也主是说private boolean isCounter=false; 这样一个域要重复99次. 而 private int turnOffTimes; 这个filed对于99个实例来说,完成是废的.内存利用率比较低.
3.为什么king里面要new 100个person? 你这是认为这100person是king的一个必要组成部分...
4.太多为show 而 show的代码......
5.其它....懒得说了,,, .
OO思维比较乱.看了你的代码大约一分钟左右,随便列以下几点不足.
1.任务的完成,counter通知king为妙,而不是king主动轮询. 或许以后关心有没放风完的不止king一个人,还有queen...等
2.100个人中只有一个是counter,也主是说private boolean isCounter=false; 这样一个域要重复99次. 而 private int turnOffTimes; 这个filed对于99个实例来说,完成是废的.内存利用率比较低.
3.为什么king里面要new 100个person? 你这是认为这100person是king的一个必要组成部分...
4.太多为show 而 show的代码......
5.其它....懒得说了,,, .
谢谢批评
第一个问题,我这里不就是counter通知king吗?我并没有让king去主动查询哦
第二个问题在第二版代码里改用继承了
第三个问题,国王不是应该知道100个犯人在哪里吗?不知道的话怎么去控制他们玩游戏呢?
第四个问题,本来就是来show的。。。
第五个问题,已经说的不少了,非常感谢!
67 楼
funcreal
2010-01-16
<pre name="code" class="java">public class Prison {
private Prisoner[] prisoners = new Prisoner[100];
public Prison() {
Light light = new Light();
prisoners[0] = new Counter(light);
for (int i = 1; i < 100; i++) {
prisoners[i] = new OtherPrisioner(light);
}
}
public void run() {
int day = 0;
while (true) {
day++;
int i = new java.util.Random().nextInt(100);
prisoners[i].setHasGoOut(true);
prisoners[i].handleTheLight();
if (i == 0 && prisoners[i].finishCount()) {
System.out.println("数完了。");
break;
}
}
for (int i = 0; i < 100; i++) {
if (!prisoners[i].hasGoOut()) {
System.out.println("全部斩杀。");
break;
}
}
System.out.println("共用了" + day / 365);
}
public static void main(String[] args) {
new Prison().run();
}
}</pre>
<p> </p>
<p>测试先行,先写个总场景吧。</p>
<p>总之就是个各类之间的知识应该尽量隔离吧。</p>
private Prisoner[] prisoners = new Prisoner[100];
public Prison() {
Light light = new Light();
prisoners[0] = new Counter(light);
for (int i = 1; i < 100; i++) {
prisoners[i] = new OtherPrisioner(light);
}
}
public void run() {
int day = 0;
while (true) {
day++;
int i = new java.util.Random().nextInt(100);
prisoners[i].setHasGoOut(true);
prisoners[i].handleTheLight();
if (i == 0 && prisoners[i].finishCount()) {
System.out.println("数完了。");
break;
}
}
for (int i = 0; i < 100; i++) {
if (!prisoners[i].hasGoOut()) {
System.out.println("全部斩杀。");
break;
}
}
System.out.println("共用了" + day / 365);
}
public static void main(String[] args) {
new Prison().run();
}
}</pre>
<p> </p>
<p>测试先行,先写个总场景吧。</p>
<p>总之就是个各类之间的知识应该尽量隔离吧。</p>
66 楼
guxiao05
2010-01-16
<p>已经失业半年的</p>
<p>===================================</p>
<p>灯</p>
<pre name="code" class="java">package justforfun;
public class Light {
private static Light _light; // 电灯
private boolean _state; // 电灯的状态
private Light() {
_state = false; // 默认是关闭的
}
public static Light creatLight() {
if (_light == null) {
_light = new Light();
}
return _light;
}
public void open() {
_state = true;
}
public void close() {
_state = false;
}
public boolean isOpen() {
return _state;
}
}
</pre>
<p> 犯人</p>
<pre name="code" class="java">package justforfun;
import java.util.Observable;
public class Prisoner extends Observable {
protected int _no; // 犯人的编号
private boolean _operationFlag; // 是否进行过操作
public Prisoner(int no) {
_no = no;
_operationFlag = false;
}
public void operation(Light light) {
if (!_operationFlag && !light.isOpen()) {
light.open();
_operationFlag = true;
}
}
public static Counter upgradeToCounter(Prisoner prisoner, int size) {
return new Counter(prisoner._no, size);
}
}
</pre>
<p> 计数者</p>
<pre name="code" class="java">package justforfun;
public class Counter extends Prisoner {
private int _count = 0; // 关灯的次数
private int _maxCount; // 监狱中罪犯的人数
public Counter(int no, int maxCount) {
super(no);
_maxCount = maxCount;
}
@Override
public void operation(Light light) {
if (light.isOpen()) {
light.close();
_count++;
if (isEnd()) {
setChanged();
notifyObservers("所有的犯人都出来放过风了");
}
}
}
private boolean isEnd() {
return _count == _maxCount - 1;
}
}
</pre>
<p> </p>
<p>监狱</p>
<pre name="code" class="java">package justforfun;
import java.util.ArrayList;
import java.util.List;
public class Prison {
private List<Prisoner> _prison; // 监狱
private int _size; // 监狱大小
private static final int INIT_SIZE = 100; // 监狱初始大小为100
public Prison() {
this(INIT_SIZE);
}
public Prison(int size) {
_size = size;
_prison = new ArrayList<Prisoner>(_size);
}
public boolean addPrisoner(Prisoner prisoner) {
if (_prison.size() >= _size) {
throw new RuntimeException("监狱已满!请申请扩建。");
} else {
_prison.add(prisoner);
return true;
}
}
public void replacePrisoner(Prisoner prisoner) {
_prison.set(prisoner._no, prisoner);
}
public Prisoner getPrisoner(int no) {
if (no > _prison.size()) {
throw new RuntimeException("对不起!没有你要找的人。");
} else {
return _prison.get(no);
}
}
public int getPrisonSize() {
return _prison.size();
}
}
</pre>
<p> </p>
<p>国王</p>
<pre name="code" class="java">package justforfun;
import java.util.Observable;
import java.util.Observer;
import java.util.Random;
public class King implements Observer {
boolean isEnd = false; // 是否结束
public static final int PRISON_SIZE = 100;
public static void main(String[] args) {
King king = new King();
Prison prison = initPrison(king);
meeting(king, prison); // 犯人们在开会
int day = start(king, prison);
System.out.println("过去了" + day / 365 + "年" + day % 365 + "天, 犯人们都解放了");
}
private static int start(King king, Prison prison) {
Light light = Light.creatLight();
// 无尽的日子开始了...
int day = 0;
while (!king.isEnd) {
// 煎熬中...
prison.getPrisoner(new Random().nextInt(PRISON_SIZE)).operation(
light);
day++;
}
return day;
}
// 先抓点犯人扔进监狱
private static Prison initPrison(King king) {
Prison prison = new Prison(PRISON_SIZE);
for (int i = 0; i < PRISON_SIZE; i++) {
Prisoner prisoner = new Prisoner(i);
prisoner.addObserver(king);
prison.addPrisoner(prisoner);
}
return prison;
}
private static void meeting(King king, Prison prison) {
Prisoner specialPrisoner = prison.getPrisoner(new Random()
.nextInt(PRISON_SIZE)); // 选出一个犯人
specialPrisoner = Prisoner.upgradeToCounter(specialPrisoner, prison
.getPrisonSize()); // 犯人升级为计数者
specialPrisoner.addObserver(king);
prison.replacePrisoner(specialPrisoner);
}
// 接收来自犯人的通知
@Override
public void update(Observable prisoner, Object content) {
System.out.println(content);
isEnd = true;
}
}
</pre>
<p> </p>
<p>===================================</p>
<p>灯</p>
<pre name="code" class="java">package justforfun;
public class Light {
private static Light _light; // 电灯
private boolean _state; // 电灯的状态
private Light() {
_state = false; // 默认是关闭的
}
public static Light creatLight() {
if (_light == null) {
_light = new Light();
}
return _light;
}
public void open() {
_state = true;
}
public void close() {
_state = false;
}
public boolean isOpen() {
return _state;
}
}
</pre>
<p> 犯人</p>
<pre name="code" class="java">package justforfun;
import java.util.Observable;
public class Prisoner extends Observable {
protected int _no; // 犯人的编号
private boolean _operationFlag; // 是否进行过操作
public Prisoner(int no) {
_no = no;
_operationFlag = false;
}
public void operation(Light light) {
if (!_operationFlag && !light.isOpen()) {
light.open();
_operationFlag = true;
}
}
public static Counter upgradeToCounter(Prisoner prisoner, int size) {
return new Counter(prisoner._no, size);
}
}
</pre>
<p> 计数者</p>
<pre name="code" class="java">package justforfun;
public class Counter extends Prisoner {
private int _count = 0; // 关灯的次数
private int _maxCount; // 监狱中罪犯的人数
public Counter(int no, int maxCount) {
super(no);
_maxCount = maxCount;
}
@Override
public void operation(Light light) {
if (light.isOpen()) {
light.close();
_count++;
if (isEnd()) {
setChanged();
notifyObservers("所有的犯人都出来放过风了");
}
}
}
private boolean isEnd() {
return _count == _maxCount - 1;
}
}
</pre>
<p> </p>
<p>监狱</p>
<pre name="code" class="java">package justforfun;
import java.util.ArrayList;
import java.util.List;
public class Prison {
private List<Prisoner> _prison; // 监狱
private int _size; // 监狱大小
private static final int INIT_SIZE = 100; // 监狱初始大小为100
public Prison() {
this(INIT_SIZE);
}
public Prison(int size) {
_size = size;
_prison = new ArrayList<Prisoner>(_size);
}
public boolean addPrisoner(Prisoner prisoner) {
if (_prison.size() >= _size) {
throw new RuntimeException("监狱已满!请申请扩建。");
} else {
_prison.add(prisoner);
return true;
}
}
public void replacePrisoner(Prisoner prisoner) {
_prison.set(prisoner._no, prisoner);
}
public Prisoner getPrisoner(int no) {
if (no > _prison.size()) {
throw new RuntimeException("对不起!没有你要找的人。");
} else {
return _prison.get(no);
}
}
public int getPrisonSize() {
return _prison.size();
}
}
</pre>
<p> </p>
<p>国王</p>
<pre name="code" class="java">package justforfun;
import java.util.Observable;
import java.util.Observer;
import java.util.Random;
public class King implements Observer {
boolean isEnd = false; // 是否结束
public static final int PRISON_SIZE = 100;
public static void main(String[] args) {
King king = new King();
Prison prison = initPrison(king);
meeting(king, prison); // 犯人们在开会
int day = start(king, prison);
System.out.println("过去了" + day / 365 + "年" + day % 365 + "天, 犯人们都解放了");
}
private static int start(King king, Prison prison) {
Light light = Light.creatLight();
// 无尽的日子开始了...
int day = 0;
while (!king.isEnd) {
// 煎熬中...
prison.getPrisoner(new Random().nextInt(PRISON_SIZE)).operation(
light);
day++;
}
return day;
}
// 先抓点犯人扔进监狱
private static Prison initPrison(King king) {
Prison prison = new Prison(PRISON_SIZE);
for (int i = 0; i < PRISON_SIZE; i++) {
Prisoner prisoner = new Prisoner(i);
prisoner.addObserver(king);
prison.addPrisoner(prisoner);
}
return prison;
}
private static void meeting(King king, Prison prison) {
Prisoner specialPrisoner = prison.getPrisoner(new Random()
.nextInt(PRISON_SIZE)); // 选出一个犯人
specialPrisoner = Prisoner.upgradeToCounter(specialPrisoner, prison
.getPrisonSize()); // 犯人升级为计数者
specialPrisoner.addObserver(king);
prison.replacePrisoner(specialPrisoner);
}
// 接收来自犯人的通知
@Override
public void update(Observable prisoner, Object content) {
System.out.println(content);
isEnd = true;
}
}
</pre>
<p> </p>
65 楼
mxswl
2010-01-16
楼主,我猜你只有半年实际JAVA经验.
OO思维比较乱.看了你的代码大约一分钟左右,随便列以下几点不足.
1.任务的完成,counter通知king为妙,而不是king主动轮询. 或许以后关心有没放风完的不止king一个人,还有queen...等
2.100个人中只有一个是counter,也主是说private boolean isCounter=false; 这样一个域要重复99次. 而 private int turnOffTimes; 这个filed对于99个实例来说,完成是废的.内存利用率比较低.
3.为什么king里面要new 100个person? 你这是认为这100person是king的一个必要组成部分...
4.太多为show 而 show的代码......
5.其它....懒得说了,,, .
OO思维比较乱.看了你的代码大约一分钟左右,随便列以下几点不足.
1.任务的完成,counter通知king为妙,而不是king主动轮询. 或许以后关心有没放风完的不止king一个人,还有queen...等
2.100个人中只有一个是counter,也主是说private boolean isCounter=false; 这样一个域要重复99次. 而 private int turnOffTimes; 这个filed对于99个实例来说,完成是废的.内存利用率比较低.
3.为什么king里面要new 100个person? 你这是认为这100person是king的一个必要组成部分...
4.太多为show 而 show的代码......
5.其它....懒得说了,,, .
64 楼
v3Empylver
2010-01-15
我的算法不知道对不对 假设初始灯是关着的
囚犯有两种状态
1.如果第一次看到灯是亮的那么关灯
2.不满足状态1时什么也不做
计数员有2种状态
1.只要出去了就开灯
2.当所有人都去过广场以后像国王宣布
灯
囚犯
计数员
监狱
囚犯有两种状态
1.如果第一次看到灯是亮的那么关灯
2.不满足状态1时什么也不做
计数员有2种状态
1.只要出去了就开灯
2.当所有人都去过广场以后像国王宣布
灯
public class Light { boolean lightStatus = false ; }
囚犯
public class Prisoner { //是否是第一次出去 当出去时遇见灯是亮着的才算第一次 int outTime = 0 ; public int useLight(Light light){ int free = 0 ; if(light.lightStatus&&this.outTime==0) { this.outTime ++ ; }else{ //如果不满足上面的 条件什么也不做 free = 3; } return free ; } }
计数员
public final class SpecialPrisoner extends Prisoner{ int prisonerCnt = 0 ; //计算可以确定多少个犯人来过广场 @Override public int useLight(Light light) { int free = 1 ; if(!light.lightStatus){ //如果灯灭了就增加一个去过广场的囚犯 this.prisonerCnt ++ ; } if(this.prisonerCnt==100){ free = 2 ; } return free; } }
监狱
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; public class Jail { public static void main(String[] args) { Random ran = new Random(); List<Prisoner> list = new ArrayList<Prisoner>(); //装载囚犯99人和计数员囚犯到监狱 for(int i = 0 ; i<99 ;i++){ list.add(new Prisoner()); } list.add(new SpecialPrisoner()); //进入小黑屋时乱序 Collections.shuffle(list); Light light = new Light(); boolean flag = true; int dayCnt = 0 ; //记录天数 while(flag) { dayCnt++; int free = list.get(ran.nextInt(100)).useLight(light); if(free == 0){ light.lightStatus = false ; }else if(free == 1){ light.lightStatus = true ; }else if(free == 2){ flag = false ; System.out.println("为了自由经过了"+dayCnt+"天"); } } } }
63 楼
sunrenen
2010-01-15
hkliya 写道
sunrenen 写道
初中刚毕业写得不好不要打击我。。。 、
package test; public class Prisoner { private Integer id; private boolean isGuard ; Prisoner(Integer id , Boolean isGuard){ this.id = id; this.isGuard = isGuard; } public boolean isGuard() { return isGuard; } public void setGuard(boolean isGuard) { this.isGuard = isGuard; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } }
package test; public class Counter { private Integer record = 0; private Integer dates = 0; public Integer getRecord() { return record; } public void setRecord(Integer record) { this.record = record; } public Integer getDates() { return dates; } public void setDates(Integer dates) { this.dates = dates; } }
package test; public class Light { private boolean status = false; public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } }
package test; import java.util.ArrayList; import java.util.List; import java.util.Random; public class Game { private static Counter counter = new Counter(); private static Light light = new Light(); public static Counter getInstance() { return counter; } public synchronized static void record() { counter.setDates(counter.getDates() + 1); if (light.isStatus()) { counter.setRecord(counter.getRecord() + 1); } } public synchronized static void guard(Prisoner prisoner) { counter.setDates(counter.getDates() + 1); if (!prisoner.isGuard() && !light.isStatus()) { light.setStatus(true); } } public synchronized static Integer getRecord() { return counter.getRecord(); } public static void show() { System.out.println(counter.getDates()); } public static void main(String[] args) { List list = new ArrayList(100); list.add(Game.getInstance()); for (int i = 0; i < 100; i++) list.add(new Prisoner(i, false)); Object o = null; Random random = new Random(); while (Game.getRecord() < 99) { o = list.get(random.nextInt(100)); if (o instanceof Counter) Game.record(); if (o instanceof Prisoner) Game.guard((Prisoner) o); } Game.show(); } }
这个单线程程序为什么要搞这么多 synchronized方法啊
isStatus()这个方法名字不太好
呵呵。。习惯了写web程序了。。isXX也是相当说javabean...getXX
62 楼
hkliya
2010-01-15
sunrenen 写道
初中刚毕业写得不好不要打击我。。。 、
package test; public class Prisoner { private Integer id; private boolean isGuard ; Prisoner(Integer id , Boolean isGuard){ this.id = id; this.isGuard = isGuard; } public boolean isGuard() { return isGuard; } public void setGuard(boolean isGuard) { this.isGuard = isGuard; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } }
package test; public class Counter { private Integer record = 0; private Integer dates = 0; public Integer getRecord() { return record; } public void setRecord(Integer record) { this.record = record; } public Integer getDates() { return dates; } public void setDates(Integer dates) { this.dates = dates; } }
package test; public class Light { private boolean status = false; public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } }
package test; import java.util.ArrayList; import java.util.List; import java.util.Random; public class Game { private static Counter counter = new Counter(); private static Light light = new Light(); public static Counter getInstance() { return counter; } public synchronized static void record() { counter.setDates(counter.getDates() + 1); if (light.isStatus()) { counter.setRecord(counter.getRecord() + 1); } } public synchronized static void guard(Prisoner prisoner) { counter.setDates(counter.getDates() + 1); if (!prisoner.isGuard() && !light.isStatus()) { light.setStatus(true); } } public synchronized static Integer getRecord() { return counter.getRecord(); } public static void show() { System.out.println(counter.getDates()); } public static void main(String[] args) { List list = new ArrayList(100); list.add(Game.getInstance()); for (int i = 0; i < 100; i++) list.add(new Prisoner(i, false)); Object o = null; Random random = new Random(); while (Game.getRecord() < 99) { o = list.get(random.nextInt(100)); if (o instanceof Counter) Game.record(); if (o instanceof Prisoner) Game.guard((Prisoner) o); } Game.show(); } }
这个单线程程序为什么要搞这么多 synchronized方法啊
isStatus()这个方法名字不太好
61 楼
sunrenen
2010-01-15
初中刚毕业写得不好不要打击我。。。 、
package test; public class Prisoner { private Integer id; private boolean isGuard ; Prisoner(Integer id , Boolean isGuard){ this.id = id; this.isGuard = isGuard; } public boolean isGuard() { return isGuard; } public void setGuard(boolean isGuard) { this.isGuard = isGuard; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } }
package test; public class Counter { private Integer record = 0; private Integer dates = 0; public Integer getRecord() { return record; } public void setRecord(Integer record) { this.record = record; } public Integer getDates() { return dates; } public void setDates(Integer dates) { this.dates = dates; } }
package test; public class Light { private boolean status = false; public boolean isStatus() { return status; } public void setStatus(boolean status) { this.status = status; } }
package test; import java.util.ArrayList; import java.util.List; import java.util.Random; public class Game { private static Counter counter = new Counter(); private static Light light = new Light(); public static Counter getInstance() { return counter; } public synchronized static void record() { counter.setDates(counter.getDates() + 1); if (light.isStatus()) { light.setStatus(false); counter.setRecord(counter.getRecord() + 1); } } public synchronized static void guard(Prisoner prisoner) { counter.setDates(counter.getDates() + 1); if (!prisoner.isGuard() && !light.isStatus()) { light.setStatus(true); prisoner.setGuard(true); } } public synchronized static Integer getRecord() { return counter.getRecord(); } public static void show() { System.out.println(counter.getDates()); } public static void main(String[] args) { List list = new ArrayList(100); list.add(Game.getInstance()); for (int i = 0; i < 100; i++) list.add(new Prisoner(i, false)); Object o = null; Random random = new Random(); while (Game.getRecord() < 99) { o = list.get(random.nextInt(100)); if (o instanceof Counter) Game.record(); if (o instanceof Prisoner) Game.guard((Prisoner) o); } Game.show(); } }
60 楼
linhong_1001
2010-01-15
不知道是怎么个好法?是若是OO,第一种稍微强点,可是代码中那么多废话也要命。还有那个老是C++什么的,现在又不是在C++,既然要写java就像点java。
59 楼
conservatism
2010-01-15
<div class="quote_title">myreligion 写道</div>
<div class="quote_div">在我看来,程序内出现System.out.println一般都在1年以内,或者只相当于一年以内。呵呵~~</div>
<p>学过方法论没,具体问题具体分析</p>
<div class="quote_div">在我看来,程序内出现System.out.println一般都在1年以内,或者只相当于一年以内。呵呵~~</div>
<p>学过方法论没,具体问题具体分析</p>
58 楼
hkliya
2010-01-15
bugmenot 写道
antiwise 写道
for(;;){}这样的语句在JDK src里经常看的到
大概while(true){}每次循环还得判断条件true? 而
第一种直接循环 效率高吧
哈哈
大概while(true){}每次循环还得判断条件true? 而
第一种直接循环 效率高吧
哈哈
这位大大,两种写法的意义和效果都是完全一样的呀
public class A {
public void b() { for (;;) ; }
public void c() { while(true) ; }
}
出来的b和c的字节码是完全一样的
Code: Stack=0, Locals=1, Args_size=1 0: goto 0
是哦,我也测试了一下,应该是编译期优化的结果吧
public class For{ public void testFor() { for(;;){ int i=0; } } public void testWhile(){ while(true){ int i=0; } } }
javap -c For结果是:
Compiled from "For.java" public class For extends java.lang.Object{ public For(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public void testFor(); Code: 0: iconst_0 1: istore_1 2: goto 0 public void testWhile(); Code: 0: iconst_0 1: istore_1 2: goto 0 } code]
相关推荐
在本节"3.3 谁是罪犯?-简单逻辑分析1"中,主要涉及的是Python编程语言中的逻辑判断语句,特别是`if`条件语句的使用以及其等价表达方式。我们将深入探讨这些知识点,并通过几个示例进行解析。 首先,我们来看一道...
用单向循环链表实现了对点杀罪犯问题(约瑟夫问题)的处理。
用java得到一个罪犯的xml例子,并生成了节点信息!给大家参考
### 知识点一:狱内罪犯危险性评估系统概述 #### 1.1 选题背景与意义 随着社会的发展与进步,狱政管理面临着越来越多的挑战,特别是对于狱内罪犯的管理和改造工作。传统的狱政管理模式在面对大量罪犯时显得...
《罪犯档案管理系统》是一款专为监狱管理设计的人工智能应用程序,旨在高效、精确地记录和处理罪犯的各类信息。这款系统集成了先进的技术,包括信息管理系统、HTML前端开发以及系统分析与设计的原理,以实现数据的...
在这个场景中,目标是确保每个有牵连的犯人都不能被关在同一间关押室,以防止他们串供。这个问题可以通过关系矩阵和特定的计算步骤来解决。 1. **关系矩阵构建**:首先,建立一个8x8的关系矩阵,表示犯人之间的关系...
《罪犯劳动管理》课程标准主要探讨的是监狱在执行刑罚和改造罪犯过程中如何有效利用劳动作为改造手段,旨在培养罪犯的劳动习惯、技能,并保护其合法权益。这是一门实践性强、应用性高的课程,对监狱管理专业的学生至...
罪犯改造评估是一项复杂的任务,涉及到多个维度的数据分析,如罪犯的个人资料、犯罪记录、改造表现等。在Access中,这些信息被精心组织成数据库表,每个表都有清晰的字段定义,如罪犯ID、姓名、年龄、犯罪类型、改造...
《网络游戏-基于Zigbee无线网络和GPRS无线网络的犯人监控系统》是一个结合了现代信息技术与安全监控的创新方案。该系统的核心是利用Zigbee无线网络和GPRS无线网络的技术,实现对犯人的实时、高效监控,确保监狱管理...
react-native-app-qiufit, 罪犯调节追踪程序 #Convict 调节跟踪器##Screenshot ##App 存储 ##Play 存储 ##AUTHOR按chengzhen设计##LICENSE GNU通用 public 许可证版本 3,29
所以,按照逻辑推理,如果假设只有一个说谎者,丁是真正的罪犯。这个问题展示了在解决逻辑谜题时,如何通过分析矛盾来确定真相,这也是小学数学教育中培养逻辑思维能力的一种方式。通过这样的问题,孩子们可以学习到...
因此,这是一个定性的探索性研究,包括两个阶段:抽样和分析,这支持名为“专业教育计划”的模型的开发和应用,该模型强调了EnSp的“创业螺旋—PEP”。 此后,介绍了数据分析和专业技能的发展,结果积极表明通过与...
这里我们关注的是一种特别的应用场景——犯人信息采集装置。这个装置是电信技术与司法管理相结合的产物,旨在提高监狱管理和犯人信息处理的效率。 犯人信息采集装置通常包含了多种技术集成,例如生物识别技术(如...
这项研究的目的是比较因家庭暴力侵害女性伴侣或配偶而被法庭命令接受家庭暴力治疗的男性(家庭暴力罪犯; DVO)(n = 35)和一组非暴力男性(n = 35)面部表情识别以及自我认同感,认知能力,外伤史和人口统计学信息...
### 信息化背景下提高罪犯教育改造质量的关键知识点 #### 一、监狱信息化的概念与目标 - **定义**:监狱信息化是指运用信息技术手段,包括信息处理、网络通讯、生物识别等,对监狱内部的信息进行采集、传输和管理...
监狱犯人自动考勤系统解决方案的计数管理软件界面提供了一个友好的用户界面,方便用户对犯人进行考勤和管理。 八、产品照片 监狱犯人自动考勤系统解决方案的产品照片展示了产品的外观和实际应用场景。
罪犯的个别教育是个体化、针对性强的教育方式,旨在针对每个罪犯的独特情况,实施个性化教育,从而达到改造的目的。 首先,开展罪犯个别教育需运用科学的手段。这包括科学地认识、分析和管理罪犯。理解罪犯不仅是...
本项目是一个综合性的Java毕业设计项目,旨在通过Spring Boot框架与Vue.js前端技术,实现一个狱内罪犯危险性评估系统。该系统不仅为监狱管理提供了一个科学、高效的评估工具,同时也为Java学习者提供了一个实战练习...
罪犯矫正心理学家的作用与冲突,王恩界,乐国安,罪犯矫正心理学家可以在监狱机构内发挥重要的作用,他们能够参与罪犯分类管理、假释鉴定、评估罪犯的心理问题、实施罪犯心理矫治