编写Scala工具函数,将leetcode多维数组的String表现形式转换为Array

文章目录

    • 思路
    • convertOneDim
    • convertTwoDim
    • 完整代码

前言:

  • 笔者最近在学习Scala,通过Scala刷leetcode算法来掌握语法。但leetcode对Scala极不友好,且测试样例所需时间非常多。因此需要使用idea进行辅助。但idea并没有封装输入,因此数组的输入封装就成了大问题

  • 比如[1, 2, 3],若要能让Scala识别,需要改写为Array(1, 2, 3)。如果数组数量增多,维数提高,刷题效率就会收到影响,因此编写本文,提供一个工具函数解决转换问题

思路

对于leetcode题目,每一题的数组维数已经固定死了。且数组最大维数基本都是二维。因此我们可以单独封装两个函数convertOneDimconvertTwoDim

但是因为方法无法提前预知返回的Array需要的泛型是什么,因此需要封装一层处理为具体类型的方法

convertOneDim

object ArrayConverter {private def toInt: String => Int = (s: String) => s.toIntprivate def toStr: String => String = s => s/*** 转换为一维数组* @param input 输入, 形如[1, 2, 3, 4, 5], 如果格式错误, 转换异常别怪我* @param handler 转换方法* @return*/private def convertOneDim[_](input: String, handler: String=>_): Array[_] = {input.substring(1, input.length - 1).split(",").map(handler)}// 转换为一维数组, 且元素为Intdef convertOneDimInt(input: String): Array[Int] = {convertOneDim[Int](input, toInt).map(_.asInstanceOf[Int])}// 转换为一维数组, 且元素为Stringdef convertOneDimStr(input: String): Array[String] = {convertOneDim[String](input, toStr).map(_.asInstanceOf[String])}/*** 转换为二维数组* @param input 输入, 形如[[1, 2], [3, 4], [5, 6]], 如果格式错误, 转换异常别怪我* @param handler 转换方法* @return*/private def convertTwoDim[_](input: String, handler: String=>Any): Array[Array[_]] = {// 去除第一个维度的[], 形成如[1,2],[3,4]这样的strval str: String = input.substring(1, input.length - 1)var start: Int = 0val ans: mutable.ArrayBuffer[Array[_]] = ArrayBuffer[Array[_]]()// 分割str, 取出单独的数组for (end <- 0 until str.length) {val c: Char = str.charAt(end)if (c == '[') start = endelse if (c == ']') ans.append(convertOneDim(str.substring(start, end + 1), handler))}ans.toArray}// 转换为一维数组, 且元素为Intdef convertTwoDimInt(input: String): Array[Array[Int]] = {convertTwoDim[Int](input, toInt).map(_.map(_.asInstanceOf[Int]))}// 转换为二维数组, 且元素为Stringdef convertTwoDimStr(input: String): Array[Array[String]] = {convertTwoDim[String](input, toStr).map(_.map(_.asInstanceOf[String]))}
}

convertOneDim编写思路非常简单,我们将左右两侧的[ ]去掉后,按照,分割。对分割后的每一个元素执行handle转换操作,最终得到Array

考虑到方法的通用性,我们无法确定我们要将字符串转换为Int, 还是String。因此用_代替。另外,我们将转换功能下放给调用方操作。在ArrayConverter内部封装toInt, toStr函数,以供调用方使用

具体来说,封装convertOneDimInt, convertOneDimStr方法,将convertOneDim返回结果强转,具体使用方式如下

object Test1 extends App {val array: Array[Int] = ArrayConverter.convertOneDimInt("[1,2,3,4,5]")println(array.mkString(" "))val array1: Array[String] = ArrayConverter.convertOneDimStr("[1,2,3,4,5]")println(array1.mkString(" "))
}

convertTwoDim

object ArrayConverter {private def toInt: String => Int = (s: String) => s.toIntprivate def toStr: String => String = s => s/*** 转换为二维数组* @param input 输入, 形如[[1, 2], [3, 4], [5, 6]], 如果格式错误, 转换异常别怪我* @param handler 转换方法* @return*/private def convertTwoDim[_](input: String, handler: String=>Any): Array[Array[_]] = {// 去除第一个维度的[], 形成如[1,2],[3,4]这样的strval str: String = input.substring(1, input.length - 1)var start: Int = 0val ans: mutable.ArrayBuffer[Array[_]] = ArrayBuffer[Array[_]]()// 分割str, 取出单独的数组for (end <- 0 until str.length) {val c: Char = str.charAt(end)if (c == '[') start = endelse if (c == ']') ans.append(convertOneDim(str.substring(start, end + 1), handler))}ans.toArray}// 转换为二维数组, 且元素为Intdef convertTwoDimInt(input: String): Array[Array[Int]] = {convertTwoDim[Int](input, toInt).map(_.map(_.asInstanceOf[Int]))}// 转换为二维数组, 且元素为Stringdef convertTwoDimStr(input: String): Array[Array[String]] = {convertTwoDim[String](input, toStr).map(_.map(_.asInstanceOf[String]))}
}

convertOneDim的编写思路就是降维,先将二维将为成一维,然后调用一维处理函数

object Test2 extends App {val array: Array[Array[Int]] = ArrayConverter.convertTwoDimInt("[[2,1,1],[1,1,0],[0,1,1]]")println(array.mkString(" "))val array1: Array[Array[String]] = ArrayConverter.convertTwoDimStr("[[2,1,1],[1,1,0],[0,1,1]]")println(array1.mkString(" "))
}

完整代码

import scala.collection.mutable
import scala.collection.mutable.ArrayBufferobject ArrayConverter {private def toInt: String => Int = (s: String) => s.toIntprivate def toStr: String => String = s => s/*** 转换为一维数组* @param input 输入, 形如[1, 2, 3, 4, 5], 如果格式错误, 转换异常别怪我* @param handler 转换方法* @return*/private def convertOneDim[_](input: String, handler: String=>_): Array[_] = {input.substring(1, input.length - 1).split(",").map(handler)}// 转换为一维数组, 且元素为Intdef convertOneDimInt(input: String): Array[Int] = {convertOneDim[Int](input, toInt).map(_.asInstanceOf[Int])}// 转换为一维数组, 且元素为Stringdef convertOneDimStr(input: String): Array[String] = {convertOneDim[String](input, toStr).map(_.asInstanceOf[String])}/*** 转换为二维数组* @param input 输入, 形如[[1, 2], [3, 4], [5, 6]], 如果格式错误, 转换异常别怪我* @param handler 转换方法* @return*/private def convertTwoDim[_](input: String, handler: String=>Any): Array[Array[_]] = {// 去除第一个维度的[], 形成如[1,2],[3,4]这样的strval str: String = input.substring(1, input.length - 1)var start: Int = 0val ans: mutable.ArrayBuffer[Array[_]] = ArrayBuffer[Array[_]]()// 分割str, 取出单独的数组for (end <- 0 until str.length) {val c: Char = str.charAt(end)if (c == '[') start = endelse if (c == ']') ans.append(convertOneDim(str.substring(start, end + 1), handler))}ans.toArray}// 转换为二维数组, 且元素为Intdef convertTwoDimInt(input: String): Array[Array[Int]] = {convertTwoDim[Int](input, toInt).map(_.map(_.asInstanceOf[Int]))}// 转换为二维数组, 且元素为Stringdef convertTwoDimStr(input: String): Array[Array[String]] = {convertTwoDim[String](input, toStr).map(_.map(_.asInstanceOf[String]))}
}object Test1 extends App {val array: Array[Int] = ArrayConverter.convertOneDimInt("[1,2,3,4,5]")println(array.mkString(" "))val array1: Array[String] = ArrayConverter.convertOneDimStr("[1,2,3,4,5]")println(array1.mkString(" "))
}object Test2 extends App {val array: Array[Array[Int]] = ArrayConverter.convertTwoDimInt("[[2,1,1],[1,1,0],[0,1,1]]")println(array.mkString(" "))val array1: Array[Array[String]] = ArrayConverter.convertTwoDimStr("[[2,1,1],[1,1,0],[0,1,1]]")println(array1.mkString(" "))
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/11726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习目标检测】二十六、基于深度学习的垃圾检测系统-含数据集、GUI和源码(python,yolov8)

设计垃圾检测系统的意义在于多个方面&#xff0c;这些方面不仅关乎环境保护和城市管理&#xff0c;还涉及到技术进步和社会效益。以下是设计垃圾检测系统的主要意义&#xff1a; 环境保护与资源回收&#xff1a; 垃圾检测系统能够有效地识别不同种类的垃圾&#xff0c;帮助人们…

linux 个人用户设置默认shell为tcsh

笔者的shell在进入时就是bash&#xff0c;使用了一种常规方法如下 在.bashrc中填入代码 exec tcsh exit 主要是进行了替换而不是修改默认的shell Generated by gpt4 在UNIX或Linux系统中&#xff0c;要将默认的shell更改为tcsh&#xff0c;你需要更改用户帐户的登录shell设置…

工作玩手机监测识别摄像机

工作场所的员工玩手机已经成为了一种常见的现象&#xff0c;特别是在办公室、生产车间等地方。而这种现象不仅仅影响了员工的工作效率&#xff0c;还可能会对工作安全造成一定的隐患。为了监测和识别员工玩手机的情况&#xff0c;工作玩手机监测识别摄像机应运而生。工作玩手机…

Linux sndconfig命令教程:如何在Linux下设置声卡(附实例详解和注意事项)

Linux sndconfig命令介绍 sndconfig&#xff08;Sound Configuration&#xff09;是一个用于设置声卡的命令。它支持即插即用&#xff08;Plug and Play&#xff0c;PnP&#xff09;设置&#xff0c;可以自动检测并设置PnP声卡。sndconfig命令可以帮助用户在Linux系统中配置声…

旧物回收小程序开发:打造绿色生活,共筑美好未来

随着环保意识的逐渐增强&#xff0c;我们越来越意识到旧物回收的重要性。为了响应这一趋势&#xff0c;我们精心研发了一款旧物回收小程序&#xff0c;旨在通过科技的力量&#xff0c;让每个人都能够轻松参与到旧物回收的行动中来&#xff0c;共同为地球环保贡献一份力量。 一…

第187题| 快速学会“阿贝尔定理”| 无穷级数(十五)|武忠祥老师每日一题

解题思路&#xff1a;这道题没有告诉我们是多少&#xff0c;没办法求出收敛半径&#xff0c;所以我们只能根据题目给的两个条件来解题&#xff08;选项代入法&#xff09;。 1.x-1&#xff0c;说明收敛的中心点是1&#xff0c;观察下列选项&#xff0c;显然答案在C和D之中。 …

【数据结构】详解栈且实现

一.栈 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#xff1a;…

【鸿蒙开发】第二十四章 IPC与RPC进程间通讯服务

1 IPC与RPC通信概述 IPC&#xff08;Inter-Process Communication&#xff09;与RPC&#xff08;Remote Procedure Call&#xff09;用于实现跨进程通信&#xff0c;不同的是前者使用Binder驱动&#xff0c;用于设备内的跨进程通信&#xff0c;后者使用软总线驱动&#xff0c;…

matlab如何画一个全屏和半屏的figure

figure(WindowState, maximized); plot(x, y);如何画一个上半个屏幕的figure screenSize get(0, ScreenSize); upperHalfPosition [screenSize(1), screenSize(2) screenSize(4)/2, screenSize(3), screenSize(4)/2]; figure(Position, upperHalfPosition);

【笔记】EF_PNN获取及运营商名称显示(待完善)

问题背景 当设备无法成功解析EONS(PNN)的值(即SIM卡EF文件内容),则会用次优先级的NITZ去refresh了SPN。(问题代码如下,是通过Phone对象拿到plmn为空) 运营商名称一般显示优先级:Eons > NITZ > XML OPL id 0 对应的是PNN第一条 功能逻辑 (定制)当卡中的spn为空…

如何进行并行执行的诊断与调优 —— 《OceanBase 并行执行》系列 6

在诊断并行执行问题时&#xff0c;我们可以从两个主要方面展开分析。首先&#xff0c;从整体系统层面进行考量&#xff0c;比如检查网络是否畅通、磁盘IO是否过载、CPU资源是否已用满&#xff1b;其次&#xff0c;针对具体的SQL语句进行深入剖析&#xff0c;定位问题SQL&#x…

HTML炫酷的相册

目录 写在前面 HTML简介 完整代码 代码分析 系列推荐 写在最后 写在前面 本期小编给大家带来一个炫酷的旋转相册&#xff0c;快来解锁属于你的独家记忆吧&#xff01; HTML简介 HTML&#xff08;全称为超文本标记语言&#xff09;是一种用于创建网页结构和内容的标记语…

前端笔记-day06

文章目录 01-浮动-基本使用02-浮动-产品布局03-浮动-清除浮动带来的影响04-清除浮动-额外标签法05-清除浮动-单伪元素法06-清除浮动-双伪元素法单伪元素和双伪元素CSS 07-清除浮动-overflow08-flex布局-体验09-flex布局-组成10-flex布局-主轴对齐方式11-flex布局-侧轴对齐方式1…

vuex核心概念-getters

除了state之外&#xff0c;有时我们还需要从state中派生出一些状态&#xff0c;这些状态是依赖state的&#xff0c;此时会用到getters。

景源畅信:小白如何做抖音电商怎么样?

在数字浪潮中崛起的抖音电商&#xff0c;以其独特的平台优势吸引了众多创业者的目光。特别是对于初入电商领域的“小白”来说&#xff0c;如何在这个全新的领域站稳脚跟&#xff0c;成为他们迫切需要解答的问题。接下来&#xff0c;我们将深入探讨小白如何在抖音电商中开辟属于…

课时124:awk实践_进阶知识_逻辑运算

1.2.3 逻辑运算 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 所谓的逻辑运算&#xff0c;其实指的就是 与或非的操作。基本语法格式如下&#xff1a;与&& - 并且关系或|| - 或者关系非&#xff01; - 取反关系简单实…

蓝桥杯备战18.[蓝桥杯 2021 省 AB] 砝码称重

P8742 [蓝桥杯 2021 省 AB] 砝码称重 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; #define endl \n #define int long long const int N 2e510; int a[N],w[N]; signed main() {std::ios::sync_with_stdio(0),cin.tie(0…

Golang的select底层数据结构与特性

select关键字用于处理同时来自多个通道的数据。它的基本工作原理是“随机选择”满足条件的分支去执行。如果没有分支满足条件(即所有通道都无法读/写)&#xff0c;select会阻塞&#xff0c;直到有分支满足条件。如果select包含default分支&#xff0c;当其他分支都不满足条件时…

使用 Python 中的 TensorFlow 检测垃圾短信

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

Python实现对线程的监控及异常时强制杀死线程的技术方案探讨

在Python中&#xff0c;使用threading库创建的线程并没有提供一个直接的方式来“杀死”或强制停止一个线程。这是因为强制终止线程可能会导致程序状态不一致、数据损坏或资源未正确释放等问题。Python设计者选择不在threading模块中提供这样的功能&#xff0c;以鼓励更安全的编…