疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java编程语言中的数据结构:数组


 

     数组是应用最广泛的数据存储结构。它被植入到编程语言中。由于数组十分易懂,所以它用来作为介绍数据结构的起步点,并展示面向对象编程和数据结构之间的相互关系。

  无序数组:

  创建一个数组类,通过调用数组类来操作数组。

  //通过面向对象来实现增、删、查的操作

  publicclass HighArray {

  privatelong[] a;

  privateintnElem;

  public HighArray(int size){

  a = newlong[size];

  nElem = 0;

  }

  //向数组内插入数据

  publicvoid setA(long value) {

  a[nElem]=value;

  nElem++;

  }

  //按条件查找数据

  publicboolean Seachkey(long value){

  boolean s=false;

  for(int i=0;i

  if(a[i]==value){

  s=true;

  break;

  }else{

  s=false;

  }

  }

  return s;

  }

  //删除指定数据

  publicboolean delete(long value){

  boolean ss=false;

  for (int i=0; i

  if(a[i]==value){

  for(int k=i;k

  a[k]=a[k+1];

  }

  ss=true;

  break;

  }

  }

  nElem--;

  return ss;

  }

  //输出全部数据

  publicvoid display(){

  for (int i = 0; i < nElem; i++) {

  System.out.print(a[i]+" ");

  }

  }

  }

  publicclass HigArrayApp {

  publicstaticvoid main(String args[]){

  int maxSize =100;

  HighArray hh;//引用HighArray类

  hh = new HighArray(maxSize);//创建HighArray对象

  hh.setA(99);

  hh.setA(77);

  hh.setA(88);

  hh.setA(66);

  hh.setA(55);

  hh.setA(44);

  hh.setA(33);

  hh.setA(22);

  hh.setA(11);

  hh.setA(26);

  //输出数组

  hh.display();

  //查找特定数据

  hh.Seachkey(66);

  if(hh.Seachkey(66)){

  System.out.println("查到:"+66);

  }else {

  System.out.println("没查到:"+66);

  }

  //删除特定数据

  hh.delete(26);

  hh.display();

  }

  }

  有序数组:

  二分查找法

  当使用二分查找法时就会提现出有序数组的好处。

  例:猜数游戏

  假如你才一个100(或n)只内的数字,你当先从50(或n/2)开始猜,假如猜的数大于50在,从51-100之间的中间处开始猜,以此类推最终可以猜到这个数字,而其猜的次数会减少很多。这就是二分查找法。

  例:

  publicclass OrdHigh {

  privatelong[] d; //引用数组a

  privateintnElems; //记录数据的中个数

  public OrdHigh(int max){

  d=newlong[max]; //创建数组

  nElems = 0;

  }

  publicint size(){ //返回nElems的值

  returnnElems;

  }

  /* 用二分查询法查询特定的数据*/

  publicint find(long seachkey){

  int lowerBound = 0; //存放最小值的下标

  int upperBound = nElems-1; //存放最大值的下标

  int curIn; //存放中间值下标

  while (true) {

  curIn = (lowerBound+upperBound)/2;//获取中间值的下标

  if(d[curIn]==seachkey){//判断中间值与特定的数据是否相等

  return curIn;

  }elseif(lowerBound>upperBound){

  returnnElems; //没找到的时候

  }

  else{

  if(d[curIn]>seachkey){

  upperBound = curIn -1; //将中间值的下标-1当做最大值的下标

  }else{

  lowerBound = curIn +1;//将中间值的下标+1当做最小值的下标

  }

  }

  }

  }

  /*向有序数组中存放值*/

  publicvoid insert(long value){

  //将数组按顺序存储

  for(int j=0;j

  //如果存入的值比原有的值小就返回,若是大就将其向比它小的值前面移

  if(d[j] > value){

  break;

  }else{

  for (int i = nElems; i>j; i--) {

  d[i] = d[i-1];

  }

  d[j] = value;

  }

  }

  nElems++;

  }

  //删除指定的数据

  publicboolean delete(long value){

  int j=find(value);

  if(j==nElems){

  returnfalse; //没有查到指定值

  }else{

  for (int i = j; i < nElems; i++) {

  d[i] = d[i+1];

  }

  nElems--;

  returntrue;

  }

  }

  //查询所有数据

  publicvoid display(){

  for(int j=0;j

  System.out.print(d[j]+" ");

  }

  }

  }

  publicclass OrdHighApp {

  publicstaticvoid main(String args[]){

  int maxSize=100;

  OrdHigh ss;

  ss = new OrdHigh(maxSize);

  ss.insert(77);

  ss.insert(88);

  ss.insert(99);

  ss.insert(44);

  ss.insert(55);

  ss.insert(33);

  ss.insert(66);

  ss.insert(22);

  ss.insert(11);

  ss.display();

  if(ss.find(55) != ss.size()){

  System.out.println("找到:"+55);

  }else {

  System.out.println("没找到:"+55);

  }

  ss.delete(77);

  ss.display();

  }

  }