如何在Scala中将元组构造为多元组

时间:2016-04-02 19:46:49

标签: scala

我有一个包含行

的文件
#include <vector>
#include <initializer_list>
#include <iostream>
#include <iterator>              // std::begin, std::end
using namespace std;

struct My_string
{
    char const* const ps;

    My_string( char const* const s )
        : ps( s )
    {
        cout << "  My_string(*) <- '" << s << "'" << endl;
    }

    My_string( My_string const& other )
        : ps( other.ps )
    {
        cout << "  My_string(const&) <- '" << other.ps << "'" << endl;
    };

    My_string( My_string&& other )
        : ps( other.ps )
    {
        cout << "  My_string(&&) <- '" << other.ps << "'" << endl;
    };
};

auto main() -> int
{
    cout << "Making vector a." << endl;
    vector<My_string> const a   = {"a1", "a2", "a3"};
    cout << "Making data for vector b." << endl;
    auto const b_data           = { "b1", "b2", "b3" };
    cout << "Making vector b." << endl;
    vector<My_string> const b( begin( b_data ), end( b_data ) );
}

我按标签拆分行,然后想要将内容分成两部分

将每行输入转换为2个独立元组的​​方法如下 -

4 3 2
5 6 7
9 8 2

1 个答案:

答案 0 :(得分:2)

我假设:

  • 每个制表符分隔的行包含三个元素
  • 每行中的元素只用一个空格字符分隔
  • 每行需要转换为元组元组

如果我遇到任何这些错误(例如,每行中可能有超过3个元素,或者你需要不同于元组的结构),它可以很容易地进行调整。

val file = "4 3 2\t5 6 7\t9 8 2"

val lines = file.split("\t").map(line => line.split(" ").toList)

val newLines = lines.map({
  case a :: b :: c :: Nil => ((a, "1", c), (b, "1", c))
})

newLines.map(println)

//  ((4, 1, 2), (3, 1, 2))
//  ((5, 1, 7), (6, 1, 7))
//  ((9, 1, 2), (8, 1, 2))

编辑:

这个答案基于你最初在你的问题中写的逻辑,并说你想要这种地图:((a b c) => (a 1 c) (b 1 c))。我现在可以看到你删除了那个部分,所以我不确定我的解决方案中的逻辑是否正确,但是现在您已经拥有了基本的骨架,您可以根据需要进行修改。