2015-09-09 5 views
0

У меня есть два списка: 1. слова 2. с соответствующей частотой считаетКак отсортировать два списка в java одновременно?

Теперь я хочу, чтобы отсортировать оба из списка в порядке убывания, так что индекс слова в первом списке соответствует тому, что из второй список, содержащий частоту, соответственно.

Добавление функции:

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; } 

Здесь отсортированный список, который содержит частоты слов и ключа список, который содержит слово.

+7

Что вы подразумеваете под "перед"? Вы пытаетесь сохранить два списка параллельных данных? Если это так, правильным решением является сохранение одного списка составного типа данных, а не попытка управления двумя списками «связанных» данных. – azurefrog

ответ

2

Один из вариантов - создать класс с двумя членами: слово и частоту. Создайте Comparator или реализуйте Comparable для сортировки по частоте, затем используйте toString(), чтобы распечатать его, как вам нравится.

1

Я не совсем понимаю ситуацию, но бросаю ее туда.

Вы можете использовать Map<String,Integer> для хранения данных с помощью карты Word -> Frequency. Теперь, если вы используете TreeMap, он автоматически сортируется в соответствии с ключами (слова в вашем случае). Теперь, если вы хотите отсортировать по значению (частоту), следуйте этому SOF Post - TreeMap sort by value

0

Карта не будет работать, если есть повторяющиеся слова. Последнее значение того же ключа заменит предыдущее. Таким образом, решения, которое приходит на ум заключается в следующем:

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; 
    } 

} 

Надеется, что это помогает.

Смежные вопросы