重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
import java.awt.BorderLayout;
创新互联2013年开创至今,是专业互联网技术服务公司,拥有项目成都做网站、成都网站设计网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元白塔做网站,已为上家服务,为白塔各地企业和个人服务,联系电话:028-86922220
import java.awt.Component;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.media.ControllerClosedEvent;
import javax.media.ControllerEvent;
import javax.media.ControllerListener;
import javax.media.EndOfMediaEvent;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.media.PrefetchCompleteEvent;
import javax.media.RealizeCompleteEvent;
import javax.media.Time;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class JMFMediaPlayer extends JFrame implements ActionListener,
ControllerListener, ItemListener {
// JMF的播放器
Player player;
// 播放器的视频组件和控制组件
Component vedioComponent;
Component controlComponent;
// 标示是否是第一次打开播放器
boolean first = true;
// 标示是否需要循环
boolean loop = false;
// 文件当前目录
String currentDirectory;
// 构造方法
public JMFMediaPlayer(String title) {
super(title);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e){
// 用户点击窗口系统菜单的关闭按钮
// 调用dispose以执行windowClosed
dispose();
}
public void windowClosed(WindowEvent e){
if (player != null){
// 关闭JMF播放器对象
player.close();
}
System.exit(0);
}
});
// 创建播放器的菜单
JMenu fileMenu = new JMenu("文件");
JMenuItem openMemuItem = new JMenuItem("打开");
openMemuItem.addActionListener(this);
fileMenu.add(openMemuItem);
// 添加一个分割条
fileMenu.addSeparator();
// 创建一个复选框菜单项
JCheckBoxMenuItem loopMenuItem = new JCheckBoxMenuItem("循环", false);
loopMenuItem.addItemListener(this);
fileMenu.add(loopMenuItem);
fileMenu.addSeparator();
JMenuItem exitMemuItem = new JMenuItem("退出");
exitMemuItem.addActionListener(this);
fileMenu.add(exitMemuItem);
JMenuBar menuBar = new JMenuBar();
menuBar.add(fileMenu);
this.setJMenuBar(menuBar);
this.setSize(200, 200);
try {
// 设置界面的外观,为系统外观
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
SwingUtilities.updateComponentTreeUI(this);
} catch (Exception e) {
e.printStackTrace();
}
this.setVisible(true);
}
/**
* 实现了ActionListener接口,处理组件的活动事件
*/
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("退出")) {
// 调用dispose以便执行windowClosed
dispose();
return;
}
FileDialog fileDialog = new FileDialog(this, "打开媒体文件", FileDialog.LOAD);
fileDialog.setDirectory(currentDirectory);
fileDialog.setVisible(true);
// 如果用户放弃选择文件,则返回
if (fileDialog.getFile() == null){
return;
}
currentDirectory = fileDialog.getDirectory();
if (player != null){
// 关闭已经存在JMF播放器对象
player.close();
}
try {
// 创建一个打开选择文件的播放器
player = Manager.createPlayer(new MediaLocator("file:"
+ fileDialog.getDirectory() + fileDialog.getFile()));
} catch (java.io.IOException e2) {
System.out.println(e2);
return;
} catch (NoPlayerException e2) {
System.out.println("不能找到播放器.");
return;
}
if (player == null) {
System.out.println("无法创建播放器.");
return;
}
first = false;
this.setTitle(fileDialog.getFile());
// 播放器的控制事件处理
player.addControllerListener(this);
// 预读文件内容
player.prefetch();
}
/**
* 实现ControllerListener接口的方法,处理播放器的控制事件
*/
public void controllerUpdate(ControllerEvent e) {
// 调用player.close()时ControllerClosedEvent事件出现。
// 如果存在视觉部件,则该部件应该拆除(为一致起见,
// 我们对控制面板部件也执行同样的操作)
if (e instanceof ControllerClosedEvent) {
if (vedioComponent != null) {
this.getContentPane().remove(vedioComponent);
this.vedioComponent = null;
}
if (controlComponent != null) {
this.getContentPane().remove(controlComponent);
this.controlComponent = null;
}
return;
}
// 如果是媒体文件到达尾部事件
if (e instanceof EndOfMediaEvent) {
if (loop) {
// 如果允许循环,则重新开始播放
player.setMediaTime(new Time(0));
player.start();
}
return;
}
// 如果是播放器预读事件
if (e instanceof PrefetchCompleteEvent) {
// 启动播放器
player.start();
return;
}
// 如果是文件打开完全事件,则显示视频组件和控制器组件
if (e instanceof RealizeCompleteEvent) {
vedioComponent = player.getVisualComponent();
if (vedioComponent != null){
this.getContentPane().add(vedioComponent);
}
controlComponent = player.getControlPanelComponent();
if (controlComponent != null){
this.getContentPane().add(controlComponent, BorderLayout.SOUTH);
}
this.pack();
}
}
// 处理“循环”复选框菜单项的点击事件
public void itemStateChanged(ItemEvent e) {
loop = !loop;
}
public static void main(String[] args){
new JMFMediaPlayer("JMF媒体播放器");
}
}
试试吧,我这里运行正常
这个结果没错啊,就像你程序中写的,折半查找算法如果找到了你要找的元素就返回这个元素在这个数组中的位置,如果没找到就返回-1,程序中要从arr这个数组中找元素6,arr这个数组中没有6,所以找不到,故返回-1。
别忘记给分哦
package com.adtech.interf.test;
public class Test{
public Test(Record a[]) {
int i, j, m, low, high;
Record temp;
for (i = 0; i a.length; i++) {
temp = a[i];
low = 0;
high = i;
while (low = high) {
m = (low + high) / 2;
if (temp.getStudentID() a[m].getStudentID()) {
high = m - 1;
} else {
low = m + 1;
}
}
for (j = i; j high + 1 j 0; j--) { // 如果jhigh 就会少遍历一个元素 || jlow
a[j] = a[j - 1];
}
a[j] = temp;
}
for (int t = 0; t a.length; t++) {
System.out.println(a[t].getStudentID());
}
}
public static void main(String args[]) {
Record record1 = new Record(2,"张三1",81.0,18);
Record record2 = new Record(4,"张三2",82.0,11);
Record record3 = new Record(5,"张三3",83.0,12);
Record record4 = new Record(43,"张三4",84.0,13);
Record record5 = new Record(21,"张三5",85.0,14);
Record record6 = new Record(54,"张三6",86.0,15);
Record record7 = new Record(22,"张三7",87.0,16);
Record record8 = new Record(6,"张三4",88.0,17);
Record record9 = new Record(223,"张三9",89.0,18);
Record record10 = new Record(545,"张三10",80.0,19);
Record [] record = new Record[]{record1,record2,record3,record4,
record5,record6,record7,record8,record9,record10};
new Test(record);
}
}
二分法查找(折半查找)的时间复杂度是O(log2n)
即是最坏的情况比较次数是2为底2n的对数。也就数如果数组长度为2,最坏的情况比较2两次;数组长度为16,最坏的情况比较5次;数组长度1204,最坏的情况是比较11次 就可以找到这个值或者确定找不到这个值。
你的代码就是通过判断比较的次数来决定是否结束循环,当已比较(循环)次数大于最坏情况的次数还没有结束(number != a[middle]),则说明数组中不存在这个值。不过这里是用的N/2来近似的判断。
另一种更普遍的写法
public class Demo {
public static void main(String[] args) {
// 你原来的代码
System.out.println(Arrays.toString(a));
Scanner scanner = new Scanner(System.in);
System.out.println("输入整数,程序判断该整数是否在数组中:");
int number = scanner.nextInt();
int index = binary(a, number);
if (index == -1) {
System.out.printf("%d不在数组中.\n", number);
} else {
System.out.printf("%d在数组中, 在数组中的位置下标是%d.", number, index);
}
}
private static int binary(int[] array, int value) {
int start = 0;
int end = array.length - 1;
while (start = end) {
int middle = (start + end) / 2;
if (value == array[middle]) {
return middle;
} else if (value array[middle]) {
start = middle + 1;
} else {
end = middle - 1;
}
}
return -1;
}
}