尝试读取clojure中的文本文件并将数据插入列表或向量中

时间:2019-04-20 05:58:28

标签: clojure

所以基本上我的问题是我试图从文本文件中读取数据,该文本文件的编号如下:“ 1 5 3 8 9 3 23 67 90”,我想按编号读取它们并将其放在一个列表或向量或数组。但是,这是我第一次使用Clojure进行编码,这就是为什么我问这个问题。

到目前为止,我确定这是不正确的。

#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <limits.h>

char A[32], B[32], C[64];
int score[2][32][32];

void print_result(int d, int i, int j)
{
    char c = d ? B[j] : A[i];
    int s0 = i > 0 ? score[0][i-1][j] + (A[i-1] == c) : INT_MAX;
    int s1 = j > 0 ? score[1][i][j-1] + (B[j-1] == c) : INT_MAX;

    if(s0 <= s1 && i > 0)
        print_result(0, i-1, j);
    else if(j > 0)
        print_result(1, i, j-1);

    printf("%c", c);
}

void print_result(int i, int j)
{
    if(score[0][i-1][j] < score[1][i][j-1])
        print_result(0, i-1, j);
    else
        print_result(1, i, j-1);
}

int main()
{
    fgets(A, sizeof(A), stdin);
    fgets(B, sizeof(B), stdin);

    int m = strlen(A) - 1; // -1 to remove LF
    int n = strlen(B) - 1;

    for(int j = 0; j <= n; ++j)
    {
        for(int i = 0; i <= m; ++i)
        {
            score[0][i][j] = !i && !j ? 0 : std::min(
                i > 0 ? score[0][i-1][j] + (A[i-1] == A[i]) : INT_MAX,
                j > 0 ? score[1][i][j-1] + (B[j-1] == A[i]) : INT_MAX
            );
            score[1][i][j] = !i && !j ? 0 : std::min(
                i > 0 ? score[0][i-1][j] + (A[i-1] == B[j]) : INT_MAX,
                j > 0 ? score[1][i][j-1] + (B[j-1] == B[j]) : INT_MAX
            );
        }
    }

    printf("repetitions: %d\n", std::min(score[0][m-1][n], score[1][m][n-1]));

    print_result(m, n);
    printf("\n");

    return 0;
}

但是,这只会将文件读取为一个字符串。所以我决定添加这一行

(def nums11 (slurp "C:\\Users\\XXX\\Desktop\\100.txt"))

在我将它们拆分为列表,向量或数组之后,有什么方法可以添加它们。

或者也许有一种简单的方法可以做到这一点?

谢谢。

1 个答案:

答案 0 :(得分:3)

您已经走对了路,所以我将尝试解释下一步:

函数<input type="text"> <input type="number"> <input type="url"> <button>Get it</button>返回字符串clojure.string/split。 Clojure中的向量是实现Java接口vector collection ,因此,如果您所需要做的就是将文件的内容转换为代表数字的String集合(以将其转换为实际数字,继续阅读)。

可能您想将元素作为实际数字进行操作。在Clojure中,您需要使用一些函数将每个String转换为数字(例如将java.util.List转换为实际数字34)。有两种简单的方法:使用Java互操作并调用"34"或使用Clojure提供的函数,该函数能够读取String并返回它表示的任何内容(例如Integer.parseInt(...))。

由于我们需要对表示数字的字符串列表的每个元素调用函数(read-string),因此我们将使用read-string,该函数需要一个函数map和一个集合f,并在xs的每个元素上调用函数f,将结果作为另一个列表返回。

如果我们将它们粘合在一起,将类似于以下内容(我将使用xs为中间结果命名)

let

...这里的数字列表位于(let [file-contents (slurp "C:\\Users\\XXX\\Desktop\\100.txt") nums-as-strings (clojure.string/split file-contents #" ") numbers (map read-string nums-as-strings)] 上;现在您可以对它们执行操作,例如将它们全部求和:

numbers

我已经掩盖了许多小细节,但这应该使您处于正确的轨道。