我有一个由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) 在C +中,可以使用迭代器来写入序列.最简单的例子是:
vector<int> v;
for (vector<int>::iterator it = v.begin(); it!=v.end(); ++it) {
*it = 42;
}
Run Code Online (Sandbox Code Playgroud)
我需要更复杂的东西 - 将迭代器保持为类成员以供以后使用.但我不知道如何从Java迭代器中获得这种行为.
Java中是否有可写的迭代器?
如果没有,那么取代它们的是什么?
修改标准库对象的方法返回的可变对象是否安全?
这是一个具体的例子; 但如果可能的话,我正在寻找一般答案.
#m is a MatchObject
#I know there's only one named group in the regex
#I want to retrieve the name and the value
g, v = m.groupdict().popitem()
#do something else with m
Run Code Online (Sandbox Code Playgroud)
这段代码安全吗?我担心通过改变groupdict()我会破坏对象m(我以后还需要它).
我对此进行了测试,随后对m.groupdict()的调用仍返回原始字典; 但据我所知,这可能与实现有关.
我正在寻找类似的弱引用实现java.lang.ref.WeakReference,但它提供了一种set()方法或一些其他方式来重新引用创建的弱引用对象.这是一个例子:
MutableWeakReference ref = new MutableWeakReference(someObject);
ref.set(anotherObject);
Run Code Online (Sandbox Code Playgroud)
我需要这个以避免对象创建,在我的情况下,将执行时间减慢一个数量级,因为我不断更改我的弱引用引用的对象.
我试图从JDK复制代码,但似乎不可能,因为java.lang.ref.Reference使用sun.misc.Cleaner内部的类.我也看了Android的实现,但它似乎依赖于Dalvik VM的垃圾收集.我想知道这是否真的可以在不改变JVM /环境的情况下实现.
我正在学习C++(来自java)并且最近发现你可以传递函数.这真的很酷,我认为非常有用.现在我正在考虑如何使用它,并且突然出现在我脑海中的一个想法是一个完全可定制的类.
对于完全可定制的类(代码),我的列车的最佳示例将是一个人类.人将拥有与P.有关的所有功能.后来人可以拿起一把剑(S),所以现在Person可以访问与P和S有关的所有功能.
这有限制或性能问题吗?这是草率的,只是简单的皱眉?
任何见解都是教育性的,谢谢.
〜Aedon
首先,我要像其他人一样开始.我是python的新手.我的老师给了我这个问题:
def f(a, b, c):
a = 1
c = b
c[0] = 2
a = 10
b = [11, 12, 13]
c = [13, 14, 15]
f(a, b, c)
print a, b, c
Run Code Online (Sandbox Code Playgroud)
它打印:
10 [2, 12, 13] [13, 14, 15]
Run Code Online (Sandbox Code Playgroud)
我理解,因为整数是不可变的,所以保持在10,但我不明白为什么b改变而c不改变.
我想弄清楚如何在惰性列表的计算中使用可变状态.
例如,这是一个使用可变数组(源)实现的天真的Eratosthenes Sieve :
import Control.Monad.ST
import Data.Array.ST
import Data.Array.Unboxed
import Control.Monad
import Data.List
prime :: Int -> UArray Int Bool
prime n = runSTUArray $ do
arr <- newArray ( 2 , n ) True :: ST s ( STUArray s Int Bool )
forM_ ( takeWhile ( \x -> x*x <= n ) [ 2 .. n ] ) $ \i -> do
ai <- readArray arr i
when ( ai ) $ forM_ [ i^2 …Run Code Online (Sandbox Code Playgroud) 我想创建一个表示字符串的python类,但可以有效地修改.我考虑过实现一个树状数据结构,但我不知道如何让它像字符串一样运行,这样它就可以用在所有类型的字符串函数中,例如在正则表达式中.
当然,每次需要时都可以从数据结构构造一个字符串,但这不是非常有效,并且浪费了数据结构的效率.
有任何想法吗?
在C ++ 14标准(ISO / IEC 14882:2014)中,第5.19节第2款(强调我的)中添加了“ 不可更改 ”一词:
甲条件表达式 e是一个核心常量表达式除非e的评价,如下所述抽象机(1.9),将评估下面的表达式中的一个的规则:
- [...]
- 左值到右值转换(4.1),除非将其应用于
- [...]
- 非易失性glvalue,它引用用constexpr定义的非易失性对象,或引用该对象的不可更改子对象,或者
因此,此代码在C ++ 14中不正确:
class A {
public:
mutable int x;
};
int main(){
constexpr A a = {1};
constexpr int y = a.x;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,在C ++ 11中是否正确?
这是缺陷报告(CD3)1405,他们提议在其中添加非可变的:
当前,文字类类型可以具有可变成员。尚不清楚这是否会对constexpr对象和常量表达式造成任何特殊的问题,如果是这样,应该如何处理。
所以我会说这是正确的C ++ 11代码。尽管如此,我还是使用-std = c ++ 11尝试了Clang和GCC,并且都输出了一个错误,指出常量表达式中不允许使用可变变量。但是该约束是在C ++ 14中添加的,而在C ++ 11中则没有。
有谁知道该代码在C ++ 11中是否正确?
另请参阅缺陷报告(CD3)1428。
我是Python的新手,试图理解可变对象和不可变对象之间的区别。Python中的可变类型之一是列表。假设L = [1,2,3],则L具有指向对象[1,2,3]的ID。如果[1,2,3]的内容被修改,则L仍保留相同的id。换句话说,即使对象的大小和内容已更改,L仍与同一对象关联。
对于不可变的对象,我的理解是不允许修改对象。因此,如果使用新值重新分配了变量,则该变量将绑定到具有不同ID的新对象。我希望字符串的行为类似。但是我尝试修改一个字符串,但是字符串id并没有改变。
string = "blue"
for i in range(10):
string = string + str(i)
print("string id after {}th iteration: {}".format(i,id(string)))
string id after 0th iteration: 46958272
string id after 1th iteration: 46958272
string id after 2th iteration: 46958272
string id after 3th iteration: 47077400
string id after 4th iteration: 47077400
string id after 5th iteration: 47077400
string id after 6th iteration: 47077400
string id after 7th iteration: 47077400
string id after 8th iteration: 47077400
string id after 9th …Run Code Online (Sandbox Code Playgroud)