0

だから私はこのようなファイルを持っています:

    1st 2nd­ nth
    e1­, ­­v1, 1
    e1, v3, 2
    e1, v4, 4
    e1, v5, 7
    e2, v1, 1
    ., ­., .
    ., ­., .
    ., ­., .

ここで、最初の列をハッシュマップ(e1、e2、またはe3)のキーにし、値を「Ratings」と呼ばれるArrayListにし、2番目の列にその値(int)を持たせます。 arraylistのn番目のインデックス内。

これまでのところ、私のコード全体は次のとおりです。

import java.util.*;
import java.io.*;

public class Setup
{
    public static void Setup(String[] args)
    {
        String user;
        int value, location;
        //Create a Hashmap that holds a string key and an ArrayList value
        HashMap<String, ArrayList<Integer>> userRatings = new HashMap<String, ArrayList<Integer>>();
        try
        {
            BufferedReader bufferReader = new BufferedReader(new FileReader("Student list.txt")); //read from file
            String line, sentence; //declare two string variables
            String[] sData; //declare a string array (store the contents here)
            line = bufferReader.readLine(); //Read the line
            while (line != null) //While there is a line, do this:
            {
                line = bufferReader.readLine();
                sData  = line.split(", "); //Into the string array, enter individual values in the line split by the ", " characters
                int iData[] = new int[sData.length]; //Create an int array the size of the string array
                user = sData[0];
                for (int i = 0; i <sData.length; i++) //fill the int array with the int-version of the string array
                {
                    iData[i] = Integer.parseInt(sData[i]); //pass the strings as integers into the integer array
                }
                value = iData[1];
                location = iData[2];
                if(!userRatings.containsKey(user)) //The user does not have ratings.
                {
                    ArrayList<Integer> ratings = new ArrayList<Integer>();
                    //                     ratings = userRatings.get(user);
                    for (int j = 0; j < 50; j++)
                    {
                        ratings.add(j);
                    }
                    System.out.println(user + " " + userRatings.get(user));

                }
                else //The user has ratings
                {
                    userRatings.get(user).add(location,value);
                    System.out.println(user + " " + userRatings.get(user));
                }
            }
            bufferReader.close();
        }    catch (FileNotFoundException e)
        {
            System.out.println("File does not exist or could not be found.");
        }
        catch (IOException e)
        {
            System.out.println("Can't read from file");
        }
        catch (NullPointerException e)
        {
        }
    }
}

arraylistの内容の変更に問題があります。

要約すると、ファイルの最初の列のすべての文字列は、ハッシュマップ(userList)に独自のキーを持ちます。プログラムは、キーがあるかどうかを確認します。キーが存在しない場合は、の値として新しい配列リストを作成します。鍵。arrayListには50個のインデックスが設定され、そのうち「0」が含まれます。その後、arraylistには、2番目の列の整数がn番目の列の対応する値に追加されるファイルから新しい値が追加されます。

配列リストにデータを入力するにはどうすればよいですか。また、ユーザーe6のn番目のインデックスに新しい整数を追加したい場合に追加できるように編集するにはどうすればよいですか。

4

2 に答える 2

1

n番目の値を読み取って、それを使用して値をリストに挿入できると思います。

例えば

List<Integer> list = new ArrayList<Integer>();
//values values (0) will be inserted into the list
//after that for each value in the nth you do something as follows    
//i is the value in the nth column, if the least value for i is 1 otherwise just use i
list.add(i-1, value); 

また、使用を参照するために、次のようにクラスを実装する代わりにインターフェースします-

Map<String, List<Integer>> userRatings = new HashMap<String, List<Integer>>();
List<Integer> ratings = new ArrayList<Integer>();

ユーザーe6のn番目のインデックスに値を挿入するには:

List<Integer> ratings = userRatings.get(user); 
if(ratings == null) { 
     ratings = new ArrayList<Integer>(); //it's not in the map yet
     //insert 50 0s here
     userRatings.put(user, ratings);
}
ratings.add(i, value); //i is the nth index and value is the rating
于 2012-06-04T02:52:55.873 に答える
0

指定されたキーがマップに存在しない場合は、新しいキー値ペアを追加する必要があります

if(!userRatings.containsKey(user)) //The user does not have ratings.
{
   ArrayList<Integer> ratings = new ArrayList<Integer>();                   
   for (int j = 0; j < 50; j++) {
       ratings.add(j);
  }
  userRatings.put(user, ratings); // place new mapping 
  System.out.println(user + " " + userRatings.get(user));
} else //The user has ratings
{
    ArrayList<Integer> ratings  = userRatings.get(user);
    ratings.add(location,value); // Update your list with location and value
    System.out.println(user + " " + userRatings.get(user)); 
}

iData[i] = Integer.parseInt(sData[i]);NumberFormatExceptionv1をintに解析できないため、ファイルの内容がスローされるため、これは機能しません。

代わりに、次のようなことを行うことができます。

value = Integer.parseInt(sData[1].trim().substring(1));
location = Integer.parseInt(sData[2].trim());

2つのキーの値を比較するには:

アプローチ1

ArrayList<Integer> first = userRatings.get(e1);
ArrayList<Integer> second = userRatings.get(e2);

//Taking the smallest size will ensure that we don't get IndexOutOfBoundsException.

int length = first.size() < second.size() ? first.size() : second.size();

for(int iDx = 0; iDx < legth; iDx++){
   //compare content
}

アプローチ2

ArrayList<Integer> first = userRatings.get(e1);
ArrayList<Integer> second = userRatings.get(e2);

Arrays.equals(first.toArray(), second.toArray());
于 2012-06-04T02:52:38.957 に答える