热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【转】Java工具类——数组操作ArrayUtil

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http:blog.csdn.netjiangjunshow也欢迎大家转载本篇文章。分

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

package com.luang.util.common;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Map;import java.util.Random;import java.util.TreeMap;/** *  * ArrayUtil.java * * &#64;desc 数组操作工具 * &#64;author Guoxp * &#64;datatime Apr 7, 2013 4:03:49 PM * */public class ArrayUtil {        /**     * 排序算法的分类如下&#xff1a;     * 1.插入排序&#xff08;直接插入排序、折半插入排序、希尔排序&#xff09;&#xff1b;     * 2.交换排序&#xff08;冒泡泡排序、快速排序&#xff09;&#xff1b;     * 3.选择排序&#xff08;直接选择排序、堆排序&#xff09;&#xff1b;      * 4.归并排序&#xff1b;      * 5.基数排序。     *     * 关于排序方法的选择&#xff1a;     * (1)若n较小(如n≤50)&#xff0c;可采用直接插入或直接选择排序。     * (2)若文件初始状态基本有序(指正序)&#xff0c;则应选用直接插人、冒泡或随机的快速排序为宜&#xff1b;     * (3)若n较大&#xff0c;则应采用时间复杂度为O(nlgn)的排序方法&#xff1a;快速排序、堆排序或归并排序。     *     */             /**      * 交换数组中两元素      *      * &#64;since 1.1      * &#64;param ints      *            需要进行交换操作的数组      * &#64;param x      *            数组中的位置1      * &#64;param y      *            数组中的位置2      * &#64;return 交换后的数组      */      public static int[] swap(int[] ints, int x, int y) {          int temp &#61; ints[x];          ints[x] &#61; ints[y];          ints[y] &#61; temp;          return ints;      }        /**      * 冒泡排序 方法&#xff1a;相邻两元素进行比较 性能&#xff1a;比较次数O(n^2),n^2/2&#xff1b;交换次数O(n^2),n^2/4      *      * &#64;since 1.1      * &#64;param source      *            需要进行排序操作的数组      * &#64;return 排序后的数组      */      public static int[] bubbleSort(int[] source) {          for (int i &#61; 1; i for (int j &#61; 0; j if (source[j] > source[j &#43; 1]) {                      swap(source, j, j &#43; 1);                  }              }          }          return source;      }        /**      * 直接选择排序法 方法&#xff1a;每一趟从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c; 顺序放在已排好序的数列的最后&#xff0c;直到全部待排序的数据元素排完。      * 性能&#xff1a;比较次数O(n^2),n^2/2 交换次数O(n),n      * 交换次数比冒泡排序少多了&#xff0c;由于交换所需CPU时间比比较所需的CUP时间多&#xff0c;所以选择排序比冒泡排序快。      * 但是N比较大时&#xff0c;比较所需的CPU时间占主要地位&#xff0c;所以这时的性能和冒泡排序差不太多&#xff0c;但毫无疑问肯定要快些。      *      * &#64;since 1.1      * &#64;param source      *            需要进行排序操作的数组      * &#64;return 排序后的数组      */      public static int[] selectSort(int[] source) {            for (int i &#61; 0; i for (int j &#61; i &#43; 1; j if (source[i] > source[j]) {                      swap(source, i, j);                  }              }          }          return source;      }        /**      * 插入排序 方法&#xff1a;将一个记录插入到已排好序的有序表&#xff08;有可能是空表&#xff09;中,从而得到一个新的记录数增1的有序表。 性能&#xff1a;比较次数O(n^2),n^2/4      * 复制次数O(n),n^2/4 比较次数是前两者的一般&#xff0c;而复制所需的CPU时间较交换少&#xff0c;所以性能上比冒泡排序提高一倍多&#xff0c;而比选择排序也要快。      *      * &#64;since 1.1      * &#64;param source      *            需要进行排序操作的数组      * &#64;return 排序后的数组      */      public static int[] insertSort(int[] source) {            for (int i &#61; 1; i for (int j &#61; i; (j > 0) && (source[j] 1]); j--) {                  swap(source, j, j - 1);              }          }          return source;      }        /**      * 快速排序 快速排序使用分治法&#xff08;Divide and conquer&#xff09;策略来把一个序列&#xff08;list&#xff09;分为两个子序列&#xff08;sub-lists&#xff09;。 步骤为&#xff1a;      * 1. 从数列中挑出一个元素&#xff0c;称为 "基准"&#xff08;pivot&#xff09;&#xff0c; 2.      * 重新排序数列&#xff0c;所有元素比基准值小的摆放在基准前面&#xff0c;所有元素比基准值大的摆在基准的后面      * &#xff08;相同的数可以到任一边&#xff09;。在这个分割之后&#xff0c;该基准是它的最后位置。这个称为分割&#xff08;partition&#xff09;操作。 3.      * 递归地&#xff08;recursive&#xff09;把小于基准值元素的子数列和大于基准值元素的子数列排序。      * 递回的最底部情形&#xff0c;是数列的大小是零或一&#xff0c;也就是永远都已经被排序好了      * 。虽然一直递回下去&#xff0c;但是这个算法总会结束&#xff0c;因为在每次的迭代&#xff08;iteration&#xff09;中&#xff0c;它至少会把一个元素摆到它最后的位置去。      *      * &#64;since 1.1      * &#64;param source      *            需要进行排序操作的数组      * &#64;return 排序后的数组      */      public static int[] quickSort(int[] source) {          return qsort(source, 0, source.length - 1);      }        /**      * 快速排序的具体实现&#xff0c;排正序      *      * &#64;since 1.1      * &#64;param source      *            需要进行排序操作的数组      * &#64;param low      *            开始低位      * &#64;param high      *            结束高位      * &#64;return 排序后的数组      */      private static int[] qsort(int source[], int low, int high) {          int i, j, x;          if (low while (i while (i x) {                      j--;                  }                  if (i while (i if (i 1);              qsort(source, i &#43; 1, high);          }          return source;      }      ///      //排序算法结束      //      /**      * 二分法查找 查找线性表必须是有序列表      *      * &#64;since 1.1      * &#64;param source      *            需要进行查找操作的数组      * &#64;param key      *            需要查找的值      * &#64;return 需要查找的值在数组中的位置&#xff0c;若未查到则返回-1      */      public static int binarySearch(int[] source, int key) {          int low &#61; 0, high &#61; source.length - 1, mid;          while (low <&#61; high) {              mid &#61; (low &#43; high) >>> 1;              if (key &#61;&#61; source[mid]) {                  return mid;              } else if (key 1;              } else {                  low &#61; mid &#43; 1;              }          }          return -1;      }        /**      * 反转数组      *      * &#64;since 1.1      * &#64;param source      *            需要进行反转操作的数组      * &#64;return 反转后的数组      */      public static int[] reverse(int[] source) {          int length &#61; source.length;          int temp &#61; 0;          for (int i &#61; 0; i >1; i&#43;&#43;) {              temp &#61; source[i];              source[i] &#61; source[length - 1 - i];              source[length - 1 - i] &#61; temp;          }          return source;      }     /**     * 在当前位置插入一个元素,数组中原有元素向后移动;     * 如果插入位置超出原数组&#xff0c;则抛IllegalArgumentException异常     * &#64;param array     * &#64;param index     * &#64;param insertNumber     * &#64;return     */      public static int[] insert(int[] array, int index, int insertNumber) {          if (array &#61;&#61; null || array.length &#61;&#61; 0) {              throw new IllegalArgumentException();          }          if (index-1 > array.length || index <&#61; 0) {              throw new IllegalArgumentException();          }          int[] dest&#61;new int[array.length&#43;1];          System.arraycopy(array, 0, dest, 0, index-1);          dest[index-1]&#61;insertNumber;          System.arraycopy(array, index-1, dest, index, dest.length-index);          return dest;      }            /**      * 整形数组中特定位置删除掉一个元素,数组中原有元素向前移动;      * 如果插入位置超出原数组&#xff0c;则抛IllegalArgumentException异常      * &#64;param array      * &#64;param index      * &#64;return      */      public static int[] remove(int[] array, int index) {          if (array &#61;&#61; null || array.length &#61;&#61; 0) {              throw new IllegalArgumentException();          }          if (index > array.length || index <&#61; 0) {              throw new IllegalArgumentException();          }          int[] dest&#61;new int[array.length-1];          System.arraycopy(array, 0, dest, 0, index-1);          System.arraycopy(array, index, dest, index-1, array.length-index);          return dest;      }      /**      * 2个数组合并&#xff0c;形成一个新的数组      * &#64;param array1      * &#64;param array2      * &#64;return      */      public static int[] merge(int[] array1,int[] array2) {          int[] dest&#61;new int[array1.length&#43;array2.length];          System.arraycopy(array1, 0, dest, 0, array1.length);          System.arraycopy(array2, 0, dest, array1.length, array2.length);          return dest;      }    /**      * 数组中有n个数据&#xff0c;要将它们顺序循环向后移动k位&#xff0c;      * 即前面的元素向后移动k位&#xff0c;后面的元素则循环向前移k位&#xff0c;      * 例如&#xff0c;0、1、2、3、4循环移动3位后为2、3、4、0、1。      * &#64;param array      * &#64;param offset      * &#64;return      */      public static int[] offsetArray(int[] array,int offset){          int length &#61; array.length;            int moveLength &#61; length - offset;           int[] temp &#61; Arrays.copyOfRange(array, moveLength, length);          System.arraycopy(array, 0, array, offset, moveLength);            System.arraycopy(temp, 0, array, 0, offset);          return array;      }      /**      * 随机打乱一个数组      * &#64;param list      * &#64;return      */      public static List shuffle(List list){          java.util.Collections.shuffle(list);          return list;      }        /**      * 随机打乱一个数组      * &#64;param array      * &#64;return      */      public int[] shuffle(int[] array) {          Random random &#61; new Random();          for (int index &#61; array.length - 1; index >&#61; 0; index--) {              // 从0到index处之间随机取一个值&#xff0c;跟index处的元素交换              exchange(array, random.nextInt(index &#43; 1), index);          }          return array;      }        // 交换位置      private void exchange(int[] array, int p1, int p2) {          int temp &#61; array[p1];          array[p1] &#61; array[p2];          array[p2] &#61; temp;      }  /**      * 对两个有序数组进行合并,并将重复的数字将其去掉      *       * &#64;param a&#xff1a;已排好序的数组a      * &#64;param b&#xff1a;已排好序的数组b      * &#64;return 合并后的排序数组      */      private static List mergeByList(int[] a, int[] b) {          // 用于返回的新数组&#xff0c;长度可能不为a,b数组之和&#xff0c;因为可能有重复的数字需要去掉          List c &#61; new ArrayList();          // a数组下标          int aIndex &#61; 0;          // b数组下标          int bIndex &#61; 0;          // 对a、b两数组的值进行比较&#xff0c;并将小的值加到c&#xff0c;并将该数组下标&#43;1&#xff0c;          // 如果相等&#xff0c;则将其任意一个加到c&#xff0c;两数组下标均&#43;1          // 如果下标超出该数组长度&#xff0c;则退出循环          while (true) {              if (aIndex > a.length - 1 || bIndex > b.length - 1) {                  break;              }              if (a[aIndex] else if (a[aIndex] > b[bIndex]) {                  c.add(b[bIndex]);                  bIndex&#43;&#43;;              } else {                  c.add(a[aIndex]);                  aIndex&#43;&#43;;                  bIndex&#43;&#43;;              }          }          // 将没有超出数组下标的数组其余全部加到数组c中          // 如果a数组还有数字没有处理          if (aIndex <&#61; a.length - 1) {              for (int i &#61; aIndex; i <&#61; a.length - 1; i&#43;&#43;) {                  c.add(a[i]);              }              // 如果b数组中还有数字没有处理          } else if (bIndex <&#61; b.length - 1) {              for (int i &#61; bIndex; i <&#61; b.length - 1; i&#43;&#43;) {                  c.add(b[i]);              }          }          return c;      }      /**      * 对两个有序数组进行合并,并将重复的数字将其去掉      * &#64;param a:已排好序的数组a      * &#64;param b:已排好序的数组b      * &#64;return合并后的排序数组,返回数组的长度&#61;a.length &#43; b.length,不足部分补0      */      private static int[] mergeByArray(int[] a, int[] b){          int[] c &#61; new int[a.length &#43; b.length];            int i &#61; 0, j &#61; 0, k &#61; 0;            while (i if (a[i] <&#61; b[j]) {                  if (a[i] &#61;&#61; b[j]) {                      j&#43;&#43;;                  } else {                      c[k] &#61; a[i];                      i&#43;&#43;;                      k&#43;&#43;;                  }              } else {                  c[k] &#61; b[j];                  j&#43;&#43;;                  k&#43;&#43;;              }          }          while (i while (j return c;      }      /**      * 对两个有序数组进行合并,并将重复的数字将其去掉      * &#64;param a&#xff1a;可以是没有排序的数组      * &#64;param b&#xff1a;可以是没有排序的数组      * &#64;return合并后的排序数组      * 打印时可以这样&#xff1a;      * Map map&#61;sortByTreeMap(a,b);         Iterator iterator &#61;  map.entrySet().iterator();            while (iterator.hasNext()) {               Map.Entry mapentry &#61; (Map.Entry)iterator.next();               System.out.print(mapentry.getValue()&#43;" ");            }      */      private static Map mergeByTreeMap(int[] a, int[] b) {          Map map&#61;new TreeMap();          for(int i&#61;0;ifor(int i&#61;0;ireturn map;      }      /**      * 在控制台打印数组&#xff0c;之间用逗号隔开,调试时用      * &#64;param array      */      public static String print(int[] array){          StringBuffer sb&#61;new StringBuffer();          for(int i&#61;0;i","&#43;array[i]);          }          System.out.println(sb.toString().substring(1));          return sb.toString().substring(1);      }      public static void main(String[] args){          ArrayUtil util&#61;new ArrayUtil();          int[] array0&#61;{21,24,13,46,35,26,14,43,11};          int[] array1&#61;{1,2,3,4,5,6};          int[] array2&#61;{11,22,33,44,55,66};          int[] temp&#61;util.quickSort(array0);          print(temp);                }  }  转自【http://blog.csdn.net/guoxuepeng123/article/details/8797920】
           



给我老师的人工智能教程打call&#xff01;http://blog.csdn.net/jiangjunshow


这里写图片描述

带尺寸的图片: Alt

当然&#xff0c;我们为了让用户更加便捷&#xff0c;我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

去博客设置页面&#xff0c;选择一款你喜欢的代码片高亮样式&#xff0c;下面展示同样高亮的 代码片.

// An highlighted block var foo &#61; &#39;bar&#39;;

生成一个适合你的列表


  • 项目
    • 项目
      • 项目

  1. 项目1
  2. 项目2
  3. 项目3

  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的&#xff1a;

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如&#xff1a;

TYPEASCIIHTML
Single backticks&#39;Isn&#39;t this fun?&#39;‘Isn’t this fun?’
Quotes"Isn&#39;t this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表


Markdown
Text-to-HTML conversion tool
Authors
John
Luke


如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML。

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ(n)&#61;(n−1)!∀n∈N\Gamma(n) &#61; (n-1)!\quad\forall n\in\mathbb NΓ(n)&#61;(n1)!nN 是通过欧拉积分

Γ(z)&#61;∫0∞tz−1e−tdt .\Gamma(z) &#61; \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)&#61;0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.


新的甘特图功能&#xff0c;丰富你的文章

ganttdateFormat YYYY-MM-DDtitle Adding GANTT diagram functionality to mermaidsection 现有任务已完成 :done, des1, 2014-01-06,2014-01-08进行中 :active, des2, 2014-01-09, 3d计划一 : des3, after des2, 5d计划二 : des4, after des3, 5d

  • 关于 甘特图 语法&#xff0c;参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图&#xff1a;:


这将产生一个流程图。:



  • 关于 Mermaid 语法&#xff0c;参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图&#xff1a;



  • 关于 Flowchart流程图 语法&#xff0c;参考 这儿.

导出与导入


导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 &#xff0c;生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件&#xff0c;在上方工具栏可以选择导入功能进行对应扩展名的文件导入&#xff0c;
继续你的创作。



  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎



推荐阅读
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 如何使用计算机控制遥控车的步骤和电路制作方法
    本文介绍了使用计算机控制遥控车的步骤和电路制作方法。首先,需要检查发送器的连接器和跳线,以确定命令的传递方式。然后,通过连接跳线和地面,将发送器与电池的负极连接,以实现遥控车的前进。接下来,制作一个简单的电路,使用Arduino命令将连接到跳线的电线接地,从而实现将Arduino命令转化为发送器命令。最后,通过焊接晶体管和电阻,完成电路制作。详细的步骤和材料使用方法将在正文中介绍。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
author-avatar
laknm_456
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有