1

我有一个任务要求我获取一个大型数据集,将其存储在一个数组中,然后创建以各种方式解释数据的方法。我得到的文件数据格式如下:

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 回答 2

1

该结构links并不能真正帮助您。它没有“从”和“到”的概念。您将 Persons 存储为数字,但不存储两个人之间的任何关系。您确实在研究图论,如果可以的话,您应该查看图论的参考作品和 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 实例,并停止对其他所有内容使用静态。

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类而不是只使用整数;这样你就可以用他们的名字给人们贴上标签。

于 2013-04-15T15:50:30.427 回答
0

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

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

比如说,你有一个列表,里面有左边的人。

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

对于leftList,循环遍历它直到达到最大值。左列(现在您可能会看到为什么数组/HashMap 更好......)通过执行以下操作:

leftList.add(new ArrayList());

在每个循环中。

那么你现在要做的就是读取文件并将受托者列表插入到与信任者对应的rightList中。例如,我有 1 3、1 4 和 2 3;您的实现将实现以下目标:

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

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

有了这个设置,我想你可以很容易地解决这三个问题?否则,只需在这里寻找更多建议。但请确保您先考虑清楚!

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

于 2013-04-15T16:00:32.293 回答