在许多应用程序中,我经常使用算法来利用专用的子算法(或简单明确定义的代码片段).
直到现在,当我编写主算法时,我为每个子算法创建了一个私有方法,如下例所示(OldStyle):
public class OldStyle {
public int mainAlg() {
int x = subAlg01();
int y = subAlg02();
int z = x * y;
return z;
}
private int subAlg01() {
return 3;
}
private int subAlg02() {
return 5;
}
}
Run Code Online (Sandbox Code Playgroud)
这很好但我不喜欢增加方法(subAlg01和subAlg02),即使是私有的,也只使用一种方法(mainAlg).
最近我发现使用了本地内部类,现在我的例子是(NewStyle):
public class NewStyle {
public int mainAlg() {
class Nested {
public int subAlg01() {
return 3;
}
public int subAlg02() {
return 5;
}
}
Nested n = new Nested();
int x = n.subAlg01();
int …Run Code Online (Sandbox Code Playgroud) 我在scala中有以下问题.我必须找到al list中的第一个元素,它满足OR中的两个条件的谓词函数.问题是我想获得元素,但也知道满足了两个条件中的哪一个.这是一个简单的例子:
val l1 = List("A", "B", "AA", "BB")
val l2 = List("AA", "BB", "A", "B")
def c1(s: String) = s.startsWith("B")
def c2(s: String) = s.length == 2
println(l1.find(s => c1(s) || c2(s)))
println(l2.find(s => c1(s) || c2(s)))
Run Code Online (Sandbox Code Playgroud)
结果是:
Some(B)
Some(AA)
Run Code Online (Sandbox Code Playgroud)
对于l1的情况,我希望有一些返回值(例如一个String),表示满足c1(对于l2情况,为c2).一个可能的解决方案可能是在测试之前定义一个var并将其设置在c1和c2函数中,但我想找到一个更"功能样式"的解决方案,也许会返回一个像元组的东西:(元素找到,条件满足).
在此先感谢您的帮助
我有以下问题:我有一个函数,它以List [Double]作为参数,对列表的元素执行一些算术运算,然后返回结果.我希望该函数也接受List [Int].这是一个例子:
def f(l: List[Double]) = {
var s = 0.0
for (i <- l)
s += i
s
}
val l1 = List(1.0, 2.0, 3.0)
val l2 = List(1, 2, 3)
println(f(l1))
println(f(l2))
Run Code Online (Sandbox Code Playgroud)
当然第二个println失败,因为f需要List [Double]而不是List [Int].
还要注意f函数中和的非scala样式公式,以证明需要在函数本身内使用0(或其他常量)(如果我将Int值与init s s相加而不是0.0.
哪个是使函数在Double和Int上运行的最佳方法(更少的代码)?
(我已经看到一些关于2.8数字特性的东西,我不太确定如何使用它......)
谢谢大家的帮助.
我有以下问题使用Joda-Time解析和生成夏令时(DST)小时的日期和时间.这是一个例子(请注意,2008年3月30日是意大利的夏令时变化):
DateTimeFormatter dtf = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss");
DateTime x = dtf.parseDateTime("30/03/2008 03:00:00");
int h = x.getHourOfDay();
System.out.println(h);
System.out.println(x.toString("dd/MM/yyyy HH:mm:ss"));
DateTime y = x.toDateMidnight().toDateTime().plusHours(h);
System.out.println(y.getHourOfDay());
System.out.println(y.toString("dd/MM/yyyy HH:mm:ss"));
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
3
30/03/2008 03:00:00
4
30/03/2008 04:00:00
Run Code Online (Sandbox Code Playgroud)
当我解析小时时,我得到小时为3.在我的数据结构中,我保存了存储午夜时间的那一天,然后我在一天中的每个小时(0-23)有一些值.然后,当我写出日期时,我会重新计算午夜加上小时的完整日期时间.当我总结3个小时到我的午夜时,我得到04:00:00!如果我再次解析它,我会得到4小时!
我的错误在哪里?有什么方法可以在我解析时获得第2小时或在打印时获得第3小时?
我也尝试手工构建输出:
String.format("%s %02d:00:00", date.toString("dd/MM/yyyy"), h);
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,小时2,我生成30/03/2008 02:00:00,这不是一个有效的日期(因为小时2不存在),不能再解析了.
预先感谢您的帮助.菲利波
我有一个由Jobs组成的数据结构,每个都包含一组Tasks.作业和任务数据都在以下文件中定义:
jobs.txt:
JA
JB
JC
tasks.txt:
JB T2
JA T1
JC T1
JA T3
JA T2
JB T1
Run Code Online (Sandbox Code Playgroud)
创建对象的过程如下:
- 读取每个作业,创建它并通过id存储它
- 读取任务,通过id检索作业,创建任务,在作业中存储任务
读取文件后,永远不会修改此数据结构.所以我希望作业中的任务存储在一个不可变的集合中.但我不知道如何以有效的方式做到这一点.(注意:存储作业的不可变映射可能不可变)
这是代码的简化版本:
class Task(val id: String)
class Job(val id: String) {
val tasks = collection.mutable.Set[Task]() // This sholud be immutable
}
val jobs = collection.mutable.Map[String, Job]() // This is ok to be mutable
// read jobs
for (line <- io.Source.fromFile("jobs.txt").getLines) {
val job = new Job(line.trim)
jobs += (job.id -> job)
}
// read tasks
for (line …Run Code Online (Sandbox Code Playgroud) 我使用Java 8流尝试了以下代码:
Arrays.asList("A", "B").stream()
.flatMap(s -> Arrays.asList("X", "Y").stream().map(s1 -> s + s1)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我得到的是List<Object>我想要的一段时间List<String>.如果我删除收集,我尝试:
Arrays.asList("A", "B").stream().flatMap(s -> Arrays.asList("X", "Y").stream().map(s1 -> s + s1));
Run Code Online (Sandbox Code Playgroud)
我正确得到了Stream<String>.
我哪里错了?有人能帮我吗?
提前谢谢了.
编辑:
问题是由于Eclipse(现在使用Kepler SR2和java 8补丁1.0.0.v20140317-1956).如果使用javac进行编译,或者如Holger所评论,使用Netbeans进行编译,则不会出现此问题