《java入门第一季》之Arrays类前传(排序案例以二分查找注意的问题)
根据排序算法,可以解决一些小案例。举例如下:
/*
* 把字符串中的字符进行排序。
* 举例:"dacgebf"
* 结果:"abcdefg"
*
* 分析:
* A:定义一个字符串
* B:把字符串转换为字符数组
* C:把字符数组进行排序
* D:把排序后的字符数组转成字符串
* E:输出最后的字符串
*/
public class ArrayTest {
public static void main(String[] args) {
// 定义一个字符串
String s = "dacgebf"; // 把字符串转换为字符数组
char[] chs = s.toCharArray();// 将此字符串转换为一个新的字符数组。String类的方法public char[] toCharArray() // 把字符数组进行排序
bubbleSort(chs);//自定义排序方法。这里定义为冒泡算法 // 把排序后的字符数组转成字符串,valueOf()把任意类型转换为字符串。
String result = String.valueOf(chs);// String类的方法:public static String valueOf(char[] data)返回:一个新分配的字符串 // 输出最后的字符串
System.out.println("result:" + result);
} // 冒泡排序
public static void bubbleSort(char[] chs) {// 冒泡方法,最大索引的值不用再去比较了
for (int x = 0; x < chs.length - 1; x++) {
for (int y = 0; y < chs.length - 1 - x; y++) {
if (chs[y] > chs[y + 1]) {// 前面的大于后面的,交换,始终使后面的大于前面。
char temp = chs[y];// 交换
chs[y] = chs[y + 1];
chs[y + 1] = temp;
}
}
}
}
}
二分查找存在一的一个注意事项。
二分查找仅仅在有序的数组中进行查找。如果给定的是无序的,不可以使用二分查找。下面就举例说明,问题出在哪里。
public class ArrayDemo2 {
public static void main(String[] args) {
// 定义数组
int[] arr = { 24, 69, 80, 57, 13 };
// 先排序
bubbleSort(arr);
// 后查找
int index = getIndex(arr, 80);
System.out.println("index:" + index);
}
// 冒泡排序代码
public static void bubbleSort(int[] arr) {
for (int x = 0; x < arr.length - 1; x++) {// 次数,几轮
for (int y = 0; y < arr.length - 1 - x; y++) {//
if (arr[y] > arr[y + 1]) {// 两两比较,把小的数放到前面去,把大的最终放在最后
int temp = arr[y];
arr[y] = arr[y + 1];
arr[y + 1] = temp;
}
}
}
}
// 二分查找
public static int getIndex(int[] arr, int value) {
// 定义最大索引,最小索引
int max = arr.length - 1;
int min = 0;
// 计算出中间索引
int mid = (max + min) / 2;
// 拿中间索引的值和要查找的值进行比较
while (arr[mid] != value) {
if (arr[mid] > value) {// 大了
max = mid - 1;// 向左边查找
} else if (arr[mid] < value) {// 小了
min = mid + 1;// 向右边去找查找
}
// 加入判断
if (min > max) {
return -1;
}
mid = (max + min) / 2;
}
return mid;
}
}
输出打印索引index=4
80在数组中的索引明明是80,而这里却是4..显然这是有问题的.。问题就出在排序后改变了数组的索引位置。那如何解决呢?
使用基本查找方法:
下面只给出基本查找的方法:
public static int getIndex(int[] arr,int value) {
int index = -1;
for(int x=0; x<arr.length; x++) {//遍历数组,逐一比较
if(arr[x] == value) {
index = x;
break;
}
}
return index;
}
这样,这个问题就解决了。
看标题是Arrays类的前传。那下一篇,就正式进入Arrays类,查找以及排序等等问题将会变的非常非常简单。
到目前为止,个人博客文章正式达到100篇整。心里很高兴,希望自己的文章,在能提高自己的同时,也能够帮助到更多人。目前java第一季大约四分之一了,第二季的时候会以专题的形式,对每个重点以及一些源码分析做叙述。希望看到的同行互加关注,留下脚印,一起讨论!
《java入门第一季》之Arrays类前传(排序案例以二分查找注意的问题)的更多相关文章
- 《java入门第一季》StringBuffer类小案例
/* * 把数组拼接成一个字符串 */ public class StringBufferTest2 { public static void main(String[] args) { // 定义一 ...
- 《java入门第一季》之LinkList模拟桟结构案例
需求:请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟. 定义一个类叫MyStack代码如下: packa ...
- 《java入门第一季》二维数组三个案例详解
案例一:遍历二维数组 /* 需求:二维数组遍历 外循环控制的是二维数组的长度,其实就是一维数组的个数行数. 内循环控制的是一维数组的长度,每一行,一维数组元素分别的个数. */ class Array ...
- 《java入门第一季》之有趣的集合小案例---获取10个【1-20之间】的随机数,要求不能重复。
import java.util.ArrayList; import java.util.Random; /* * 获取10个[1-20之间]的随机数,要求不能重复.(注意:不是获取10个数,如果单纯 ...
- JAVA入门第一季(mooc-笔记)
笔记相关信息 /** * @subject <学习与创业>作业1 * @author 信管1142班 201411671210 赖俊杰 * @className <JAVA入门第一季 ...
- Java入门第一季——从此投身Java??
找工作告一段落. 最后的工作呢,和java紧密相关,也是阴差阳错,不过都是软件开发,都好了,不过以后侧重点肯定是在java这边,php有机会还是一直学下去的,那么美的说~ Java开发第一季 一.简 ...
- 《java入门第一季》之Arrays类前传(排序问题)
一:冒泡排序 /* * 数组排序之冒泡排序: * 相邻元素两两比较,大的往后放,第一次完毕,最大值出现在了最大索引处 * * 引申: * 利用冒泡排序法,可以获取一个数组的最大值(先冒泡排序,取最后一 ...
- 《java入门第一季》之Arrays类
前面介绍了排序问题(见博客http://blog.csdn.net/qq_32059827/article/details/51362390):二分查找问题(见博客http://blog.csdn.n ...
- 慕课网-Java入门第一季-6-7 使用 Arrays 类操作 Java 中的数组
来源:http://www.imooc.com/code/1556 Arrays 类是 Java 中提供的一个工具类,在 java.util 包中.该类中包含了一些方法用来直接操作数组,比如可直接实现 ...
随机推荐
- React Native 4 for Android源码分析 一《JNI智能指针之介绍篇》
文/ Tamic: http://blog.csdn.net/sk719887916/article/details/53455441 原文:http://blog.csdn.net/eewolf/a ...
- Swift中的可选协议和方法的历史渊源
@objc protocol Transaction { func commit() -> Bool optional func isComplete() -> Bool } 以上协议被标 ...
- 最大熵模型The Maximum Entropy
http://blog.csdn.net/pipisorry/article/details/52789149 最大熵模型相关的基础知识 [概率论:基本概念CDF.PDF] [信息论:熵与互信息] [ ...
- 操作系统服务:OS模块
http://blog.csdn.net/pipisorry/article/details/52454486 一般的操作系统服务之OS模块Generic Operating System Servi ...
- 自制DbHelper实现自动化数据库交互
之前一直对apache的DbUtils很好奇,也很佩服其中的设计上的智慧.于是就自己模拟实现了一个更加简便的小框架.我们只需要在配置文件中写上数据库层面的连接信息,就可以随心所欲的实现自己的需求了. ...
- java.io.FileNotFoundException: ..\lib\commons-el.jar
安装openfire成功后,启动遇到java.io.FileNotFoundException: ..\lib\commons-el.jar错误,并不是缺少了jar包,只需以管理员身份运行即可解决.
- IMDG中的陷阱和问题
陷阱 使用cache API时,一个最重要的问题就是潜在的数据加载.因为IMDG提供的分布式集合也都是实现的JDK的Map.Set等接口,以JDK的Map为例,它接口规定put和remove返回被替换 ...
- Ubuntu 安装 texlive2013 及中文支持
分享一下安装和配置经验. 1.材料准备 texlive的安装包:可以百度下,这里也提供一个下载地址: http://mirror.hust.edu.cn/CTAN/systems/texlive/Im ...
- 为何不能在viewDidLoad方法中显示其他视图
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 你可以使得当视图控制器(view controller)显示自 ...
- 【Netty源码分析】发送数据过程
前面两篇博客[Netty源码分析]Netty服务端bind端口过程和[Netty源码分析]客户端connect服务端过程中我们分别介绍了服务端绑定端口和客户端连接到服务端的过程,接下来我们分析一下数据 ...