我正在尝试将旧的Quick BASIC程序转换为VB.Net.似乎没有任何直接替换旧文件语句.建立一个数据库对我的简单需求来说似乎有些过分.
如何在VB.Net中执行以下操作?
OPEN "test.dat" FOR RANDOM AS #1 LEN = 20
FIELD #1, 10 AS a$, 10 AS b$
LSET a$ = "One"
LSET b$ = "Two"
PUT #1, 1
GET #1, 1
PRINT a$, b$
CLOSE #1
Run Code Online (Sandbox Code Playgroud) 我正在阅读Collections.shuffle(List)javadoc,然后看看RandomAccess javadoc:
List实现使用的标记接口,表示它们支持快速(通常是恒定时间)随机访问.[...]
我想知道为什么这个接口(如Serializable)没有方法?这个的设计原因是什么?
即使只列出"实现"此接口,为什么不将E设置get()为方法呢?我知道并非每个列表都是随机访问,但如果没有方法,我该如何使用这个界面呢?
像这样的东西:
if(object instanceof RandomAccess){
// should I cast it if no operations can be done? why?
}
Run Code Online (Sandbox Code Playgroud)
此外,只有列表可以是RandomAccess?文件怎么样?
这个关于Haskell的主题讨论了很多(例如可变数组实现),但我仍然不确定需要频繁修改和随机访问数组/向量的情况的最佳实践是什么.
说一个长度为1,000,000的向量.对其进行操作涉及基于输入访问其(小的,例如1000个)子集,并基于输入修改值.此外,这种操作重复2,000,000次.任务本身可以在纯数据结构中实现,例如列表,如下所示,尽管效率很低:
type Vect = [Int]
f :: Vect -> [[Int]] -> Vect
f x indsList = foldl g x indsList
-- g is just an example of random-access and modifications on the values.
g :: Vect -> [Int] -> Vect
g x inds = map h $ zip x [0..]
where h (x, i) = if i `elem` inds then x !! i + 1 else x !! i
Run Code Online (Sandbox Code Playgroud)
散列/映射数据结构(例如IntMap)可以用于有效的大量随机访问,但是数组/向量也应该这样做.更重要的是,仍需要通过可变结构来解决大量修改以避免存储器复制.Haskell中是否存在可变的随机访问数组/向量?如果使用ST/IO Monads,这些控件会影响我的设置吗?
我知道,一般来说,.NET列表不适合随机访问.我总是被告知阵列最适合那个.我有一个程序需要不断(比如超过十亿次)访问.NET列表的第一个元素,我想知道这是否会减慢任何速度,或者它无关紧要因为它是第一个元素名单.我还做了很多其他的事情,比如在我进行的过程中添加和删除列表中的项目,但List永远不会是空的.
我正在使用F#,但我认为这适用于任何.NET语言(我使用.NET列表,而不是F#列表).我的列表大约有100个元素.
我有一个双值"vals"数组,我需要随机索引到这个数组并获得一个值.GenRandomNumber()返回0和1,但从来没有0或1.我使用Convert.ToInt32基本上得到一切我小数点左边的数字,但必须有这样做的更有效的方法?
这是我的代码:
public double GetRandomVal()
{
int z = Convert.ToInt32(GenRandomNumber() * (vals.Length));
return vals[z];
}
Run Code Online (Sandbox Code Playgroud)
谢谢
更新
感谢所有回复的人,但我不得不使用提供方法rand.NextDouble()的MersenneTwister随机数实现
更新2
再考虑一下,我需要做的就是生成0和array.length-1之间的随机数,然后使用它随机索引到数组中.vals长度为2 ^ 20 = 1048576,因此生成随机int就足够了.我注意到我的MersenneTwister有一个方法:
public int Next(int maxValue)
Run Code Online (Sandbox Code Playgroud)
如果我把它称为vals [rand.Next(vals.length-1)]那应该做对吗?我也看到MersenneTwister有一个构造函数:
public MersenneTwister(int[] init)
Run Code Online (Sandbox Code Playgroud)
不知道这是为了什么,我可以用它来预先填充我提供0到vals.length数组的可接受的随机数吗?
FYI vals是一个长度为1048576的双重数组,用于划分正态分布曲线.我基本上使用这种机制来尽可能快地创建正态分布的数字,monte carlo模拟每天使用数十亿个正态分布的随机数,所以每一点都有帮助.
我在java中使用RandomAccessFile.我有内存泄漏问题.我已将代码简化为以下内容:
public static void main(String[] args) throws IOException, InterruptedException
{
RandomAccessFile r = new RandomAccessFile(new File("test.dat"), "rw");
r.write(new byte[150000000], 0, 150000000);
r.getFD().sync();
r.close();
r = null;
while (true) { Thread.sleep(1000); }
}
Run Code Online (Sandbox Code Playgroud)
执行此代码后(并为GC提供足够的时间),报告的应用程序内存使用量略高于150MB.
我错过了什么?还是Java应该受到责备?
可能重复:
给定位置如何获取列表中的某个元素?
所以在python中你可以以随机访问方式获取列表中的元素....
list = [1,12,3]
print(list[1])
Run Code Online (Sandbox Code Playgroud)
它打印12 ....
你可以用c ++列表做同样的事情吗?
我有一个包含信息块的二进制文件(我将其称为数据包).每个数据包由一个固定长度的头和一个可变长度的主体组成.我要从包头本身确定身体的长度.我的任务是从文件中读取这些数据包并对它们执行一些操作.目前我正在执行以下任务:
你可以猜到,当文件大小很大时,连续读取每个数据包并处理它是一件非常耗时的事情.我想以某种方式并行化这个操作,即数据包生成操作,并将其放入一些阻塞队列,然后从队列中并行检索每个数据包并执行我的操作.
有人可以建议我如何并行生成这些数据包?
最近我在我的代码库中遇到了这个代码(当然是简化的)
auto toDelete = std::make_shared<std::string>("FooBar");
std::vector<decltype(toDelete)> myVec{toDelete};
auto iter = std::find_if(std::begin(myVec), std::end(myVec),
[](const decltype(toDelete) _next)
{
return *_next == "FooBar";
});
if (iter != std::end(myVec))
{
std::shared_ptr<std::string> deletedString = iter[0];
std::cout << *deletedString;
myVec.erase(iter);
}
Run Code Online (Sandbox Code Playgroud)
现在,我注意到我们在这里通过索引访问迭代器!
std::shared_ptr<std::string> deletedString = iter[0];
Run Code Online (Sandbox Code Playgroud)
我以前从未见过有人通过索引访问迭代器,所以我可以猜到的是迭代器被视为指针,然后我们访问指向指针的第一个元素.那么代码实际上相当于:
std::shared_ptr<std::string> deletedString = *iter;
Run Code Online (Sandbox Code Playgroud)
或者是未定义的行为?
这段代码工作正常:
string[] lineOfContents = File.ReadAllLines(@"C:\users.csv");
foreach (var line in lineOfContents)
{
string[] tokens = line.Split(',');
if (tokens[2] == "ed@yahoo.com")
{
MessageBox.Show("Email already exists");
}
else
{
MessageBox.Show("Ok");
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是这样工作的:

所以,我想用简单的代码对 CSV 文件中的“电子邮件”记录进行“直接访问”,如下所示:
