kotlin数组操作

1:示例height = [0,1,0,2,1,0,1,3,2,1,2,1] 转为 kotlin IntArray 数组

valheight:IntArray=intArrayOf(0,1,0,2,1,0,1,3,2,1,2,1)

2: 数组转子串

  1. IntArray 转 字符串(一整个拼接成带方括号格式,和打印效果一致)
valarr=intArrayOf(0,1,0,2,1,0,1,3,2,1,2,1)valstr=arr.contentToString()println(str)// 输出:[0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]
  1. 只拼接数字,无括号空格,逗号分隔
valstr2=arr.joinToString(",")// 0,1,0,2,1,0,1,3,2,1,2,1
  1. 直接连起来纯数字字符串(无分隔符)
valstr3=arr.joinToString("")// 010210132121
  1. Java int [] 对应写法对照
int[]arr={0,1,0,2,1,0,1,3,2,1,2,1};Strings=Arrays.toString(arr);

3 遍历一个数字字符串,找出其中最大数字

funfindMaxDigit(str:String):Char{// 空串判空if(str.isEmpty())return'0'varmax=str[0]for(cinstr){if(c>max){max=c}}returnmax}**// 极简一行版**valmaxChar=str.maxOrNull()?:'0'

如:

vals="010210132121"valmax=s.maxOrNull()println(max)// 输出 3

java示例:

publicstaticcharfindMax(Strings){if(s==null||s.length()==0)return'0';charmax=s.charAt(0);for(inti=0;i<s.length();i++){charc=s.charAt(i);if(c>max)max=c;}returnmax;}

4 Kotlin 字符转数字(Char → Int)
方式 1:推荐标准函数 digitToInt()
仅支持 ‘0’~‘9’,其他字符会直接抛异常。

valc:Char='5'valnum:Int=c.digitToInt()println(num)// 5

方式 2:ASCII 减法(最底层原理)
字符’0’ASCII 码是 48,减去基准值即可:

valc='7'valnum=c-'0'printlin(num)//7

方式 3:安全转换,防止报错

valc='a'valnum=c.digitToIntOrNull()?:0//安全兜底,为空就赋值 0

字符串整体转数字

valstr="123"valn=str.toInt()

java 对应写法

charc='6';intnum=c-'0';

5 怎样提取字符串指定序号位置左右两边的子串
说明:
字符串索引:s[0] 是第一个字符
左侧:0 ~ i-1
当前位:i
右侧:i+1 ~ s.length-1

  1. 最简单截取
valstr="abcdefgh"vali=3valleftPart=str.substring(0,i)// 下标0~2valrightPart=str.substring(i+1)// 下标4到末尾valcurChar=str[i]println("左:$leftPart")println("当前:$curChar")println("右:$rightPart")

输入 abcdefgh,i=3:结果:
左:abc
当前:d
右:efgh

2、封装成工具函数

/** * 根据下标i拆分字符串:左边、当前字符、右边 * @param str 原字符串 * @param i 指定索引 * @return Triple(左侧串, 当前字符, 右侧串) */funsplitByIndex(str:String,i:Int):Triple<String,Char,String>{require(iinstr.indices){"下标越界"}valleft=str.take(i)valmid=str[i]valright=str.drop(i+1)returnTriple(left,mid,right)}

如果是 List / 数组 按索引拆分

fun<T>splitListByIndex(list:List<T>,i:Int):Triple<List<T>,T,List<T>>{valleft=list.subList(0,i)valmid=list[i]valright=list.subList(i+1,list.size)returnTriple(left,mid,right)}

调用:

vals="1234567"val(left,mid,right)=splitByIndex(s,4)println(left)// 1234println(mid)// 5println(right)// 67

6 根据下标 i 把 IntArray 切分成 左侧数组 + 右侧数组
/**

  • 将IntArray按下标i分割为左右两个数组(i位置元素舍弃)
  • @param array 原数组
  • @param i 分割下标
  • @return Pair(左侧数组, 右侧数组)
    */
funsplitIntArrayByIndex(array:IntArray,i:Int):Pair<IntArray,IntArray>{require(iinarray.indices){"下标越界"}valleft=array.take(i).toIntArray()valright=array.drop(i+1).toIntArray()returnlefttoright}

使用示例

funmain(){valarr=intArrayOf(1000,999,998,997,966)valindex=3val(leftArr,rightArr)=splitIntArrayByIndex(arr,index)println(leftArr.contentToString())// [1000, 999, 998]println(rightArr.contentToString())// [966]}

如果你需要保留 i 当前元素,返回三段(左、当前、右)

funsplitTriple(array:IntArray,i:Int):Triple<IntArray,Int,IntArray>{require(iinarray.indices)valleft=array.take(i).toIntArray()valmid=array[i]valright=array.drop(i+1).toIntArray()returnTriple(left,mid,right)}

Java 等价写法

publicstaticint[][]splitArray(int[]arr,inti){int[]left=Arrays.copyOfRange(arr,0,i);int[]right=Arrays.copyOfRange(arr,i+1,arr.length);returnnewint[][]{left,right};}

注意边界情况处理
i == 0:左边为空字符串
i == str.lastIndex:右边为空字符串
传入非法下标会抛异常,可加 try-catch 捕获