由于我喜欢在Scala中编程,在我的Google采访中,我让他们给我一个Scala /函数式编程风格的问题.我得到的Scala功能样式问题如下:
您有两个由字母字符组成的字符串以及一个表示退格符号的特殊字符.我们将这个退格字符称为"/".当您到达键盘时,键入此字符序列,包括退格/删除字符.要实现的解决方案必须检查两个字符序列是否产生相同的输出.例如,"abc","aa/bc"."abb/c","abcc /","/ abc"和"// abc"都产生相同的输出"abc".因为这是一个Scala /函数编程问题,所以必须以惯用的Scala风格实现您的解决方案.
我写了下面的代码(可能不是我写的,我只是关闭内存).基本上我只是线性地通过字符串,将字符前置到列表,然后我比较列表.
def processString(string: String): List[Char] = {
string.foldLeft(List[Char]()){ case(accumulator: List[Char], char: Char) =>
accumulator match {
case head :: tail => if(char != '/') { char :: head :: tail } else { tail }
case emptyList => if(char != '/') { char :: emptyList } else { emptyList }
}
}
}
def solution(string1: String, string2: String): Boolean = {
processString(string1) == processString(string2)
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好?然后他询问时间复杂度,我回答线性时间(因为你必须处理每个字符一次)和线性空间(因为你必须将每个元素复制到一个列表中).然后他让我在线性时间内做,但是有恒定的空间.我想不出一种纯粹功能性的方法.他说尝试在Scala集合库中使用一个函数,如"zip"或"map"(我明确地记得他说过"zip"这个词).
这就是事情.我认为在没有任何可变状态或副作用的情况下,在恒定空间内进行它是不可能的.就像我认为他弄乱了这个问题.你怎么看?
你可以在线性时间内解决它,但是空间恒定吗?
functional-programming scala purely-functional scala-collections
我理解术语协方差和反方差.但是有一件小事我无法理解.在课程"Scala中的功能编程"课程中,Martin Ordersky提到:
函数在其参数类型中是逆变的,在它们的返回类型中是共变量的
所以例如在Java中,让我们Dog
扩展Animal
.让一个函数是:
void getSomething(Animal a){
Run Code Online (Sandbox Code Playgroud)
我有函数调用
Dog d = new Dog();
getSomething(d)
Run Code Online (Sandbox Code Playgroud)
所以基本上发生的事情就是这样Animal a = d
.根据维基的协方差是"将范围扩大到狭窄".上面我们正在从狗转变为动物.SO不是参数类型协变而不是逆变?
考虑以下代码:
String s = null;
s.toLowerCase();
Run Code Online (Sandbox Code Playgroud)
它引发了一个NPE:
pracJava1.Prac.main 中线程"main"java.lang.NullPointerException 中的异常(Prac.java:7)
问题是:为什么JVM也不能发出帮助消息说:
线程"main"java.lang.NullPointerException中的异常.尝试
toLowerCase() on null
这在类似的情况下很有用obj.setName(s.toLowerCase())
,其中行号不足以猜测是否obj
为null或s
.
关于它的可行性,让我们看一下生成的字节码:
stack=1, locals=2, args_size=1
0: aconst_null
1: astore_1
2: aload_1
3: invokevirtual #2 // Method java/lang/String.toLowerCase:()Ljava/lang/String;
Run Code Online (Sandbox Code Playgroud)
因此可能知道它尝试操作的方法名称.JVM专家,你有什么看法?
我使用和阅读有关@tailrec
注释的尾部递归方法.我已经通过许多链接解释了它.例如,它仅适用于自调用函数,不应覆盖等.
它到处都提到了compiler optimizes
.但是编译器做了什么魔术/概念使其尾递归.对于下面的简单函数,编译器会做什么:
@tailrec def fact(acc: Int, n: Int): Int = {
if (n <= 1) acc
else fact(n * acc, n - 1)
}
fact(1,10)
Run Code Online (Sandbox Code Playgroud)
我的意思是它将它转换为循环,重复调用它然后返回最终值?是否有纸张的链接解释它
我正在使用PhoneGap/cordova和Javascript开发一个Android应用程序.我想在我的应用程序的特定html Div中使用外部Java插件包含音频/视频捕获功能.
或者某些我可以拥有基于Java的本机小部件的机制,它将在特定位置的同一屏幕中出现(而不是完全替换当前视图并占据整个屏幕)
我在网上搜索过但找不到有效的方法.任何人都可以建议我处理这个问题吗?
我有4个元素:( List[List[Object]]
每个元素中的对象不同)我想要压缩,以便我可以拥有List[List[obj1],List[obj2],List[obj3],List[obj4]]
我试图压缩它们,我获得了一个嵌套列表,我不能应用flatten,因为它说:没有隐式参数匹配参数类型.
我怎么解决这个问题?我应该尝试另一种方式还是有办法让扁平化的工作?
我对scala有点新意,所以这可能是一个愚蠢的问题:D提前谢谢!clau
我启动了几个线程,但我没有通过信号或其他东西来阻止它们.例如,我不能将变量传递running=false
给那些线程,因为我没有它们的引用,但是有它们的名字.
我正在使用a ThreadGroup
并且我总是参考它.所以我可以做这样的事情.似乎它不起作用.
Thread[] threads = new Thread[threadGroup.activeCount()];
int count = threadGroup.enumerate(threads);
for(int i = 0; i < count; i++){
threads[i].interrupt();
}
Run Code Online (Sandbox Code Playgroud)
这是我的帖子的一个例子.
public void run{
try{
//myDAO.getRecords();
//this takes 30seconds to 60
//returns about 3 millions of records
}catch(Exception e){
//log
}
}
Run Code Online (Sandbox Code Playgroud)
当这个线程正在执行时,我想在中间停止它.无论如何batabase查询正在运行,但我想停止获取结果.
即使我打电话,我仍然得到了结果interrupt()
.有没有其他方法可以做到这一点还是我做错了什么?最终任务是取消Java中长时间运行的SQL查询.
我对scala.collection.JavaConversions有一个非常基本的问题.我希望以下代码可以工作,但是从java.util.List [String]到scala List [String]的隐式转换不会发生.为什么?
import collection.JavaConversions._
import java.util
class Test {
def getStrings() : List[String] = {
val results : java.util.List[String] = new java.util.ArrayList[String]()
results
}
}
Run Code Online (Sandbox Code Playgroud)
我从compi得到以下消息
type mismatch;
found : java.util.List[String]
required: scala.collection.immutable.List[String]
results
^
Run Code Online (Sandbox Code Playgroud) 这是一个特殊的问题。目的是通过SMTP发送Office365的邮件。
我能够始终如一地从本地笔记本电脑发送邮件。
但是,当部署在我们服务器上(位于防火墙之后)时,它不会成功。注意:smtp.office365.com
可以在服务器上访问并确认端口587的端口。这是在我的本地计算机上成功运行的属性。
Properties props = new Properties();
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.connectiontimeout", MAIL_TIMEOUT);
props.put("mail.smtp.timeout", MAIL_TIMEOUT);
props.put("mail.debug", true);
this.session = Session.getInstance(props);
session.setDebug(true);
Transport transport = session.getTransport();
transport.connect("smtp.office365.com", 587, email, pass);
Run Code Online (Sandbox Code Playgroud)
但是在服务器上失败。这是服务器调试日志:
DEBUG: setDebug: JavaMail version 1.6.2
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.office365.com", port 587, isSSL false
220 PN1PR0101CA0017.outlook.office365.com Microsoft ESMTP MAIL Service ready at Fri, 28 Jun 2019 06:39:41 +0000
DEBUG SMTP: connected to host "smtp.office365.com", port: …
Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的问题.这不仅适用于spray-json,而且我已经阅读过与argonaut和circe类似的说法.所以请赐教.
在spray-json中,我遇到了声明There is no reflection involved
.我理解基于类的类方法,如果用户提供JsonFormat,那么一切都很好.但是这个说法在使用时也是如此DefaultJsonProtocol
吗?
因为当我们你看看这个,你能看到的使用clazz.getMethods
,clazz.getDeclaredFields
等等.这不是反射的使用情况如何?虽然当然要归功于object#apply
我们不需要担心使用反射在Java世界中设置不同.但至少阅读字段名称,我不明白如何反思过度.
java ×6
scala ×6
android ×1
cordova-3 ×1
flatten ×1
jakarta-mail ×1
javascript ×1
jvm ×1
list ×1
nested ×1
office365 ×1
spray-json ×1