解释数组java中的数据

时间:2013-04-15 15:26:02

标签: java arraylist java.util.scanner

我有一项任务,要求我获取一个大型数据集,将其存储在一个数组中,然后创建以各种方式解释数据的方法。我给出的文件数据是这样的形式:

0 138
    0 139
    0 140
    0 141
    0 142
    0 799
    4 1
    4 10
    4 12
    4 18
等......(非常大) 该数据应该代表人的社交网络,数字代表个人。每一行都包含左侧的人,他们“信任”右侧的人。我应该解释这些数据,以便我可以找到特定人信任的所有人,有多少人信任某个人,以及如何找到最信任的人。但是,我完全不知道如何编写这些方法,所以我想知道你们是否可以帮助我。这是我到目前为止的代码:

public class SocialNetwork {

static Scanner scanner = new Scanner(System.in);
static void findTrusted()
{
    System.out.println("Please input person number you would like to find Trustees for");
    trustee = (scanner.next());
}


public static void main(String[] args){
    File inData = new File("dataset.txt");
    ArrayList<Integer> links = new ArrayList<Integer>();
    try
    {   
        Scanner in = new Scanner(inData);
        in.nextLine();
        in.nextLine();
        in.nextLine();
        in.nextLine();
        while (in.hasNext())
        {
            int trustee = in.nextInt();
            int trusted = in.nextInt();
            links.add(trustee);
            links.add(trusted);


        }
        in.close();
    }

    catch (FileNotFoundException e){
        e.printStackTrace();
    }
}   
}

正如您所看到的,我的findTrustee方法很少。我只是不知道从哪里开始。我想出了一个小伪代码来尝试解剖需要做的事情:

  1. 提示用户输入哪个人(整数)找到他/她的受托人
  2. 搜索输入的人(整数)的arraylist链接
  3. 打印以请求人开头的行右侧的所有人(整数)
  4. 但是,我只是不知道该怎么做。

2 个答案:

答案 0 :(得分:1)

结构links并没有真正帮助你。它不知道“来自”和“来”。您将人员存储为数字,但不存储两个人之间的任何关系。你真的从事图论,你什么时候可以看一下图论的参考书和Java库。

那么,什么是信任链接?这个对象有两个人,受托人和值得信赖的人。为此创建一个类:

public class Trust {
    private final int trustee;
    private final int trusted;
    public Trust(final int trustee, final int trusted) {
        this.trustee = trustee;
        this.trusted = trusted;
    }
    // Getters, equals, hashCode, toString, formatted output for humans.
}

让您的班级SocialNetwork能够创建这些。顺便说一句,在main方法中创建一个SocialNetwork实例,并停止对其他所有内容使用static。

public Trust createTrust(Scanner scanner) {
    int trustee = scanner.nextInt();
    int trusted = scanner.nextInt();
    return new Trust(trustee, trusted);
}

您可能需要添加异常处理和文件结束处理。

使links列出Trust个对象,然后根据需要编写扫描该列表的方法。

/**
    Return a list of all the people who trustee trusts.
    @param trustee A person in the system.
    @return a list of the people trustee trusts.
 */
public List<Integer> trusting(int trustee) {
    final List<Integer> trusted = new ArrayList<>();
    for (Trust link: links) {
        // Add something from link to trusted if it should.
        // This looks like homework; I'm not doing everything for you.
    }
    return trusted;
}

根据需要编写其他方法。然后,考虑这些数据结构是否对此问题有效。 Map会更好吗?来自其他图书馆的MultiMap?某种开源图论库?也许您应该使用数据库。也许你应该有一个Person类,而不是只使用整数;这样你就可以用他们的名字来标记人。

答案 1 :(得分:0)

我认为有很多方法可以实现这一点(无论性能如何)。例如,您可以使用HashMap,数组数组(或列表列表,如果您真的喜欢列表...)

我会举一个使用列表的例子,因为你似乎正在使用它......(虽然我认为这有点奇怪)

说,你有一个列表左边的人。

ArrayList<ArrayList> leftList = new ArrayList<ArrayList>();

对于leftList,循环直到达到最大值。左列(现在你可能会看到为什么数组/ HashMap更好......)做类似的事情:

leftList.add(new ArrayList());

在每个循环中。

然后你现在要做的就是阅读文件并将受托者列表插入对应于truster的rightList。例如。我有1 3,1 4和2 3;你的实现将实现如下:

leftList.get(1).add(3) / leftList.get(1).add(4) / leftList.get(2).add(3)

取决于您正在阅读的哪一行。

通过这种设置,我猜你可以很容易地解决这三个问题吗?否则,请在这里寻找更多建议。但请务必先考虑一下!

希望我的回答能给你一些想法。