0

基本的に、人に関する詳細を含むファイルを取得しました。各人は改行で区切られています。

name Marioka address 97 Garderners Road birthday 12-11-1982 \n
name Ada Lovelace gender woman\n
name James address 65 Watcher Avenue

" 等々..

そして、それらを[キーワード:値]ペア配列に解析したいと思います。

{[Name, Marioka], [Address, 97 Gardeners Road], [Birthday, 12-11-1982]},
{[Name, Ada Lovelace], [Gender, Woman]}, and so on....

等々。上記の場合、キーワードは一連の定義された単語になります: 名前、住所、誕生日、性別など...

これを行う最善の方法は何ですか?

これは私がやった方法ですが、うまくいきますが、より良い解決策があるかどうか疑問に思っていました.

    private Map<String, String> readRecord(String record) {
        Map<String, String> attributeValuePairs = new HashMap<String, String>();
        Scanner scanner = new Scanner(record);
        String attribute = "", value = ""; 

        /* 
         * 1. Scan each word. 
         * 2. Find an attribute keyword and store it at "attribute".
         * 3. Following words will be stored as "value" until the next keyword is found.
         * 4. Return value-attribute pairs as HashMap
         */

        while(scanner.hasNext()) {
            String word = scanner.next();
            if (this.isAttribute(word)) {
                if (value.trim() != "") {
                    attributeValuePairs.put(attribute.trim(), value.trim());
                    value = "";
                }
                attribute = word;
            } else {
                value += word + " ";
            }
        }
        if (value.trim() != "") attributeValuePairs.put(attribute, value);

        scanner.close();
        return attributeValuePairs;
    }

    private boolean isAttribute(String word) {
        String[] attributes = {"name", "patientId", 
            "birthday", "phone", "email", "medicalHistory", "address"};
        for (String attribute: attributes) {
            if (word.equalsIgnoreCase(attribute)) return true;
        }
        return false;
    }
4

6 に答える 6

1

これを試して:

ArrayList<String> keywords = new ArrayList<String>();
    keywords.add("name");
    keywords.add("address");
    keywords.add("birthday");
    keywords.add("gender");
    String s[] = "name James address 65 Watcher Avenue".trim().split(" ");
    Map<String,String> m = new HashMap<String,String>();
    for(int i=0;i<s.length;i++){

        if(keywords.contains(s[i])){
            System.out.println(s[i]);

            String key =s[i];
            StringBuilder b = new StringBuilder();
            i++;
            if(i<s.length){
            while(!(keywords.contains(s[i]))){

                System.out.println("i "+i);
                if(i<s.length-1){
                b.append(s[i] + " ");
                }
                i++;
                if(i>=s.length){
                    b.append(s[i-1]);
                    break;
                }
            }
            }
            m.put(key, b.toString());
            i--;
        }
    }
    System.out.println(m);

識別したいキーワードを名前付きの配列リストに追加するだけで機能しますkeywords

EDITED:「誰かがキーワードの1つを含む名前またはアドレスを持っている場合」出力を生成しないことに注意してください

于 2012-10-23T13:17:42.413 に答える
0

ファイルを1行ずつ読み取り、各行でgetKeywordValuePairs()メソッドを呼び出します。

public class S{

    public static void main(String[] args) {
        System.out.println(getKeywordValuePairs("name Marioka address 97 Garderners Road birthday 12-11-1982",
                new String[]{
                    "name", "address", "birthday", "gghghhjgghjhj"
                }));
    }

    public static String getKeywordValuePairs(String text, String keywords[]) {

        ArrayList<String> keyWordsPresent = new ArrayList<>();
        ArrayList<Integer> indicesOfKeywordsPresent = new ArrayList<>();

        // finding the indices of all the keywords and adding them to the array
        // lists only if the keyword is present
        for (int i = 0; i < keywords.length; i++) {
            int index = text.indexOf(keywords[i]);
            if (index >= 0) {
                keyWordsPresent.add(keywords[i]);
                indicesOfKeywordsPresent.add(index);
            }
        }

        // Creating arrays from Array Lists
        String[] keywordsArray = new String[keyWordsPresent.size()];
        int[] indicesArray = new int[indicesOfKeywordsPresent.size()];
        for (int i = 0; i < keywordsArray.length; i++) {
            keywordsArray[i] = keyWordsPresent.get(i);
            indicesArray[i] = indicesOfKeywordsPresent.get(i);
        }


        // Sorting the keywords and indices arrays based on the position where the keyword appears
        for (int i = 0; i < indicesArray.length; i++) {
            for (int j = 0; j < indicesArray.length - 1 - i; j++) {
                if (indicesArray[i] > indicesArray[i + 1]) {
                    int temp = indicesArray[i];
                    indicesArray[i] = indicesArray[i + 1];
                    indicesArray[i + 1] = temp;
                    String tempString = keywordsArray[i];
                    keywordsArray[i] = keywordsArray[i + 1];
                    keywordsArray[i + 1] = tempString;
                }
            }
        }

        // Creating the result String
        String result = "{";
        for (int i = 0; i < keywordsArray.length; i++) {
            result = result + "[" + keywordsArray[i] + ",";
            if (i == keywordsArray.length - 1) {
                result = result + text.substring(indicesArray[i] + keywordsArray[i].length()) + "]";
            } else {
                result = result + text.substring(indicesArray[i] + keywordsArray[i].length(), indicesArray[i + 1]) + "],";
            }
        }
        result = result + "}";
        return result;
    }
}
于 2012-10-23T12:58:02.910 に答える
0

これには、(疑似コード):

1.  >Read a line
2.  >Split it by a delimiter(' ' in your case)
2.5 >Map<String,String> mp = new HashMap<String,String>();
3.  >for(int i = 0; i < splitArray.length; i += 2){
      try{
        mp.put(splitArray[i],splitArray[i+1]);
      }catch(Exception e){ System.err.println("Syntax Error"); }
4.  >Bob's your uncle, Fanny's your aunt. 

「;」と言うようにデータファイルを変更する必要がありますが = スペース。そのような

name Ada;Lovelace
于 2012-10-23T12:25:04.747 に答える
0

最善の方法は、データをマップに配置することです。この方法で、キー値を設定できます (「名前」:「まりおか」)

Map<String,String> mp=new HashMap<String, String>();
    // adding or set elements in Map by put method key and value pair
    mp.put("name", "nameData");
    mp.put("address", "addressData")...etc
于 2012-10-23T12:19:31.190 に答える
0

私はまったく別のソリューションを持っており、Java regular expressions and Enumそれを読み込んで pojo に解析する能力を探っています。これは将来の証明ソリューションです。

ステップ-1:列挙型を定義します(列挙型を拡張して、必要なすべてのキーを追加できます)

public enum PersonEnum {
  name { public void set(Person d,String name) {  d.setName(name) ;} },
  address { public void set(Person d,String address) {  d.setAddress(address); } },
  gender { public void set(Person d,String address) {  d.setOthers(address); } };
  public void set(Person d,String others) { d.setOthers(others);  }
}

ステップ 2 : pojo クラスを定義します (pojo が必要ない場合は、enum を使用するように変更できますHashMap)

public class Person {

    private String name;
    private String address;
    private String others;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public String getOthers() {
        return others;
    }
    public void setOthers(String others) {
        this.others = others;
    }
    @Override
    public String toString() {
        return name+"==>"+address+"==>"+others;
    }

ステップ-2: ここにパーサーがあります

public static void main(String[] args) {

    try {
        String inputs ="name Marioka address 97 Garderners Road birthday 12-11-1982\n name Ada Lovelace gender" +
                " woman address London\n name James address 65 Watcher Avenue";
        Scanner scanner = new Scanner(inputs);
        List<Person> personList = new ArrayList<Person>();
        while(scanner.hasNextLine()){
            String line = scanner.nextLine();
            List<String> filtereList=splitLines(line, "name|address|gender");
            Iterator< String> lineIterator  = filtereList.iterator();
            Person p = new Person();
            while(lineIterator.hasNext()){
                PersonEnum pEnum = PersonEnum.valueOf(lineIterator.next());
                pEnum.set(p, lineIterator.next());
            }
            personList.add(p);
            System.out.println(p);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public static List<String> splitLines(String inputText, String pString) {
    Pattern pattern =Pattern.compile(pString);
    Matcher m = pattern.matcher(inputText);
    List<String> filteredList = new ArrayList<String>();
    int start = 0;
    while (m.find()) {
        add(inputText.substring(start, m.start()),filteredList);
        add(m.group(),filteredList);
        start = m.end();
    }
    add(inputText.substring(start),filteredList);
    return filteredList;
}
public static void add(String text, List<String> list){
    if(text!=null && !text.trim().isEmpty()){
        list.add(text);
    }
}

注: PersonEnum で可能な列挙型定数を定義する必要があります。そうしないと、防止するための対策を講じる必要があります。InvalidArgumentException

eg: java.lang.IllegalArgumentException: No enum const class com.sa.PersonEnum.address

それ以外の場合、これは私が提案できる最高の Java(OOP) ソリューションの 1 つになる可能性があります。乾杯!

于 2012-10-25T17:53:54.443 に答える