Какие структуры данных лучше всего использовать (например, хэш-карту / список и т. Д.) Для следующего сценария - PullRequest
2 голосов
/ 02 февраля 2012

У меня есть требование, как будто есть элемент A, который имеет несколько подпунктов, таких как a1, b1, c1 ... и каждый подпункт имеет по очереди несколько подпунктов, таких как {a11, a12, a13 ...} которые соответствуют a1 и {b11, b12, b13 ..}, которые соответствуют b1. Таким образом, это в основном похоже на древовидную структуру с элементом A в качестве корня. Теперь есть некоторая отметка времени, связанная с каждым элементом и его подпунктами. Отметка времени отличается для всех этих элементов и подпунктов. Мне нужно найти элемент / подпункт с последней отметкой времени. Как приступить к решению этого в Java. Я новичок в использовании структур данных.

Ответы [ 8 ]

1 голос
/ 02 февраля 2012

Для структур данных взгляните на java.util.TreeMap для реализации Map на основе дерева и java.util.TreeSet для реализации Set на основе дерева.Это стандартные реализации, найденные в API коллекций Java.

package com.mindprod.example;

import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import static java.lang.System.out;

/**
 * Example use of java.util.TreeMap.
 *
 * @author Roedy Green, Canadian Mind Products
 * @version 1.0 2010-02-25 initial version
 * @see TestHashMap
 * @since 2010-02-25
 */
public final class TestTreeMap
{
// --------------------------- main() method ---------------------------

/**
 * Sample code to TEST TreeMap.
 *
 * @param args not used
 */
public static void main( String[] args )
    {
    // create a new HashMap
    TreeMap<String, String> t = new TreeMap<String, String>( /* no size estimates needed */ );
    // add some key/value pairs to the TreeMap
    t.put( "WA", "Washington" );
    t.put( "NY", "New York" );
    t.put( "RI", "Rhode Island" );
    t.put( "BC", "British Columbia" );
    t.put( "NC", "North Carolina" );
    t.put( "NE", "Nebraska" );
    // look up a key in the TreeMap
    String stateName = t.get( "NY" );
    // prints "New York"
    out.println( stateName );
    out.println( "enumerate all the keys in the TreeMap, by key" );
    // keySet gives you a Set, which is not a List.
    // If you need something you can sort, use toArray.
    // If you need a List, then use Arrays.asList.
    for ( String key : t.keySet() )
        {
        String value = t.get( key );
        // prints lines of the form NY New York
        // in key order, unlike a HashMap
        out.println( key + " " + value );
        }
    out.println( "enumerate all the values in the TreeMap, by key, note values out of order" );
    // values gives you a Collection which is not a List.
    // If you need something you can sort, use to Array.
    // If you need a List, then use Arrays.asList.
    for ( String value : t.values() )
        {
        // prints lines of the form New York
        // in key order, unlike a HashMap
        out.println( value );
        }
    out.println( "enumerate all the key/value Entries in the TreeMap, by key" );
    // This gives you a Map of Entry items. This is not suitable for sorting.
    for ( Map.Entry<String, String> entry : t.entrySet() )
        {
        // prints lines of the form NY=New York
        // in key order, unlike a HashMap
        out.println( "as Entry: " + entry );
        // this does not require an expensive get lookup to find the value.
        String key = entry.getKey();
        String value = entry.getValue();
        out.println( "separately: " + key + " " + value );
        }
    out.println( "extract the keys into an array" );
    // actual type is a private nested static class TreeMap.KeySet
    // This Set is not Serializable.
    Set<String> justKeys = t.keySet();
    // Use toArray that takes an skeleton String[] array,
    // otherwise we end up with a useless Object[] instead of a String[].
    final String[] keys = justKeys.toArray( new String[ justKeys.size() ] );
    out.println( "extract values into an array, may contain duplicates unlike a Set." );
    // the actual type is a private nested static class TreeMap.Values
    // This Collection is not Serializable.
    final Collection<String> justValues = t.values();
    final String[] values = justValues.toArray( new String[ justValues.size() ] );
    out.println( "extract key/value pair entries into an array." );
    final Set<Map.Entry<String, String>> justEntries = t.entrySet();
    @SuppressWarnings( "unchecked" ) final Map.Entry<String, String>[] keyValuePairs =
            justEntries.toArray( new Map.Entry[ justEntries.size() ] );
    // Infuriatingly, this generates an unchecked conversion warning message.
    // Type erasure won't let us say:
    // Map.Entry<String, String>[] keyValuePairs =
    // justEntries.toArray ( new Map.Entry<String,String>[justEntries.size()] );
    // There might be some clever way of using Class.asSubclass to mollify the compiler.
    // There so many times when generics create more problems than they solve.
    }
}

Вас также может заинтересовать эта ссылка

1 голос
/ 02 февраля 2012

Использование TreeMap

Это будет соответствовать вашим потребностям. Вот пример программы с java.samples.com

// Create a tree map 
TreeMap tm = new TreeMap(); 
// Put elements to the map 
tm.put("John Doe", new Double(3434.34)); 
tm.put("Tom Smith", new Double(123.22)); 
tm.put("Jane Baker", new Double(1378.00)); 
tm.put("Todd Hall", new Double(99.22)); 
tm.put("Ralph Smith", new Double(-19.08)); 
// Get a set of the entries 
Set set = tm.entrySet(); 
// Get an iterator 
Iterator i = set.iterator(); 
// Display elements 
while(i.hasNext()) { 
Map.Entry me = (Map.Entry)i.next(); 
System.out.print(me.getKey() + ": "); 
System.out.println(me.getValue()); 
} 
System.out.println(); 
// Deposit 1000 into John Doe's account 
double balance = ((Double)tm.get("John Doe")).doubleValue(); 
tm.put("John Doe", new Double(balance + 1000)); 
System.out.println("John Doe's new balance: " + 
tm.get("John Doe"));
0 голосов
/ 02 февраля 2012

Предложите реализовать свою собственную древовидную структуру, так как похоже, что вам нужно поддерживать явную древовидную модель самостоятельно.Например,

public class Item implements Comparable<Item>{

    private String name;
    private long timestamp;
    private List<Item> subItems = new ArrayList<Item>();

    public Item(String name, long timestamp){
        this.name = name;
        this.timestamp = timestamp;
    }

    public void addItem(Item subItem){
        this.subItems.add(subItem);
    }

    @Override
    public int compareTo(Item o) {
        return Long.signum(this.timestamp - o.timestamp);
    }

}

Если вы хотите получить элемент с наибольшей или наименьшей временной меткой или отсортировать его, вы можете поместить все элементы в список и отсортировать их, используя Collections.sort(), так как вы реализовали интерфейс Comparable..

0 голосов
/ 02 февраля 2012

Рассматривайте каждый элемент как узел.Так что сделайте класс Node.Этот класс будет иметь следующие члены - nodeName, parentNode, childNode.

public class Node
  {
    private String name;
    private Node parentNode;
    private Node childNode;
  }

Добавить дополнительные атрибуты в соответствии с вашим использованием.

Написать конструктор для создания объекта Node, как показано ниже -

public Node(String name)
  {
    this.name = name;
    this.parentNode = null;
    this.childNode = null;
  }

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

Я не проверял код.Пожалуйста, переформатируйте его согласно требованию и дайте мне знать, если это решит вашу проблему.

0 голосов
/ 02 февраля 2012

Вы можете просто использовать массив

ArrayList list=new ArrayList();
ArrayList sublist=new ArrayList();
ArrayList subsublist=new ArrayList();
subsublist.add("cat");
sublist.add(subsublist);
list.add(sublist);
0 голосов
/ 02 февраля 2012

Я рекомендую вам создать класс для элемента, тогда вы можете создать класс отдельно.

Для подпунктов зависит от типов данных, выберите различные структуры данных. Во-первых, если вы знаете, что элементы относятся к одним и тем же типам, например, a1, b1, c1 - все строки, вы можете использовать ArrayList для их хранения или использовать массив, если общее число ограничено. Если они относятся к разным типам, рассмотрим hashmap.

0 голосов
/ 02 февраля 2012

Предполагается, что нет элемента B:

  1. Сохранение элемента A, элемента B, элемента C ... в связанном списке.(каждый узел становится корнем)
  2. элемент A будет иметь следующие дочерние узлы: a1, b1, c1 ... в связанном списке.(каждый узел становится корнем)
  3. a11, a12, a13 могут быть сохранены как дочерние узлы a1.
  4. Аналогично для b11, b12, b13 ...

Теперь, где вы столкнулись с проблемой?

0 голосов
/ 02 февраля 2012

В JDK реализована приличная древовидная структура.

Посмотрите на TreeModel и TreeNode, которые предназначены для использования с JTreePanel, но ничто не мешает вам использовать его вне Swing.

...