簡體   English   中英

如何在Java中同時對兩個列表排序?

[英]How to sort two list in java concurrently?

我有兩個列表:1.帶單詞2.帶有各自的頻率計數

現在,我想對兩個列表進行降序排序,以使第一個列表中的單詞索引與包含頻率計數的第二個列表的索引匹配。

添加功能:

    public String[] process() throws Exception
   {

    String[] ret = new String[20];
    int c=0;

    BufferedReader br = new BufferedReader(new FileReader(inputFileName));
    String line = br.readLine();
    List<String> result  = new ArrayList<String>();
    List<Integer> sorted = new ArrayList<Integer>();
    List<String> key= new ArrayList<String>();
    List<String> new_list = new ArrayList<String>();
    int x=0;
    while(line!=null){
        StringTokenizer st = new StringTokenizer(line,delimiters);
        String token = "";
        while (st.hasMoreTokens()) {
            token = st.nextToken();
            //System.out.println(token);
            if(token!=null)
            {
            //System.out.println(token);
                result.add( x,token.toLowerCase());

            //System.out.println("Key is" + x + "\t" + result.get(x));
                x++;
            }
        }
        line=br.readLine();
    }
            for(int w =0;w<x;w++){
        c=0;
        String copy=result.get(w);
        int i;
        for(i =0;i<stopWordsArray.length;i++){
            if(copy.compareTo(stopWordsArray[i])==0){
      c=1;
      break;
      }
      }
     if(c==0){
      new_list.add(copy);
      }
      }
      if(c==0){

    Map<String, Integer> map = new HashMap<String, Integer>();
    for (String temp : new_list) {
    Integer count = map.get(temp);
    map.put(temp, (count == null) ? 1 : count + 1);
   }

int i=0;
int  sort = 0;
String key1 = "";
for (Map.Entry<String, Integer> entry : map.entrySet()) {
 sort = entry.getValue();
 key1 = entry.getKey();
 sorted.add(i,sort);
 key.add(i,key1);

 i++;
  }
   Integer maxi= Collections.max(sorted);
   System.out.println(maxi);
   Integer value = sorted.indexOf(maxi);
   System.out.println(value);
   System.out.println("Word is:"  + key.get(value));

   }
  return ret; }

這里排序的是包含單詞頻率的列表,而鍵是包含單詞的列表。

一種選擇是創建一個具有兩個成員的類:單詞和頻率。 創建一個Comparator或實現Comparable以便根據頻率進行排序,然后實現toString()來按您喜歡的方式進行打印。

我不完全了解這種情況,但是把它扔在那里。

您可以使用Map<String,Integer>將數據與映射Word-> Frequency一起存儲。 現在,如果您使用TreeMap,它將根據關鍵字(您所用的單詞)自動排序。 現在,如果要按值(頻率)排序,請遵循此SOF Post- TreeMap按值排序

如果單詞重復,地圖將無法正常工作。 同一密鑰的最后一個值將替換先前的那個。 因此,我想到的解決方案如下:

SortingWordAndCounts.java

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class SortingWordAndCounts {

    public static void main(String args[]) {
        ArrayList<WordFreq> wordFreqList = new ArrayList<WordFreq>();

        for (int i = 10; i >= 0; i--) {
            WordFreq wf = new WordFreq();
            wf.setWord("Word" + (i + 1));
            wf.setFrequency(i + 10);
            wordFreqList.add(wf);
        }

        System.out.println("===== Unsorted Result=====");

        for (WordFreq wf : wordFreqList) {
            System.out.println(wf.word + "=" + wf.frequency);
        }

        System.out.println("===== sort by Word=====");
        // Now Sort list and print
        for (WordFreq wf : new SortingWordSAndCounts().sortByWord(wordFreqList,"DESC")) {

            System.out.println(wf.word + "=" + wf.frequency);

        }
System.out.println("===== sort by Frequency=====");

        // Now Sort list and print
        for (WordFreq wf : new SortingWordSAndCounts().sortByFrequency(wordFreqList,"DESC")) {

            System.out.println(wf.word + "=" + wf.frequency);

        }


    }

    public ArrayList<WordFreq> sortByWord(ArrayList<WordFreq> wordFreqList, String sortOrder) {
        Comparator<WordFreq> comparator = new Comparator<WordFreq>() {

            @Override
            public int compare(WordFreq o1, WordFreq o2) {

                if (sortOrder.equalsIgnoreCase("DESC"))
                    return o2.word.compareTo(o1.word);
                else
                    return o1.word.compareTo(o2.word);

            }
        };

        Collections.sort(wordFreqList, comparator);
        return wordFreqList;
    }

    public ArrayList<WordFreq> sortByFrequency(ArrayList<WordFreq> wordFreqList, String sortOrder) {
        Comparator<WordFreq> comparator = new Comparator<WordFreq>() {

            @Override
            public int compare(WordFreq o1, WordFreq o2) {

                if (sortOrder.equalsIgnoreCase("DESC"))

                    return o2.frequency - o1.frequency;
                else
                    return o1.frequency - o2.frequency;

            }
        };

        Collections.sort(wordFreqList, comparator);
        return wordFreqList;
    }

}

創建pojo:

WordFreq.java


public class WordFreq {

    String word;
    int frequency;
    public String getWord() {
        return word;
    }
    public void setWord(String word) {
        this.word = word;
    }
    public int getFrequency() {
        return frequency;
    }
    public void setFrequency(int frequency) {
        this.frequency = frequency;
    }

}

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM