2017-02-14 19 views
0

私の製品のソートされたリストを取得したい。 リストは、PafElementクラスにある属性ポストでソートする必要があります。それは整数です。 "getSortedList"メソッドで商品リストをソートし始めました 4つのオブジェクトでメソッドをテストしました。オブジェクト1とオブジェクト2が切り替わります。これは、オブジェクト1がHashMap内の位置2にあり、オブジェクト2が位置1にあることを意味します。他のオブジェクトは問題ありません。値がオブジェクトの場合、属性でハッシュマップをソート

明らかに、HashMapは新しい要素をマップの最後に配置しません。私は、これを達成する可能性があるかどうかを知りたい。

public Product(){} 

public Product(Init activity){ 
    final Init init = activity; 
    Log.i("PRODUCT","Costruct"); 
    // TODO: 12.02.2017 use own logger class 
    TextView productName = (TextView)activity.findViewById(R.id.productName); 

    TextView.OnEditorActionListener listener = new TextView.OnEditorActionListener() { 
     @Override 
     public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { 
      if (event != null) { 
       if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) { 
        Long milis = System.currentTimeMillis(); 
        setId(milis); 
        setName(v.getText().toString()); 
        setPosition(getNextPosition()); 
        create(init); 
        v.setText(""); 
        v.setVisibility(View.GONE); 
        // TODO: 08.02.2017 log successful creation; 
        return true; 
       } 
      } 
      return false; 
     } 

    }; 

    productName.setOnEditorActionListener(listener); 
    productName.setVisibility(View.VISIBLE); 
} 

public static void toList(Product p){ 
    productList.put(p.getId(),p); 
} 

public static void initialise(Element products){ 
    NodeList productList = products.getChildNodes(); 
    for(int i = 0; i < productList.getLength(); i++){ 
     Node product = productList.item(i); 
     if(product.getNodeName().equals("product")) { 
      Element productElement = (Element) product; 
      String id = productElement.getAttribute("productId"); 
      Integer pos = Integer.parseInt(productElement.getAttribute("position")); 
      String name = productElement.getElementsByTagName("name").item(0).getTextContent(); 
      Product p = new Product(); 
      p.setName(name); 
      p.setId(Long.parseLong(id)); 
      p.setPosition(pos); 
      updatePosition(pos); 
      Product.toList(p); 
     } 
    } 
} 

public static HashMap<String,Product> getList(){ 
    return productList; 
} 

public static HashMap<String,Product> getSortedList(){ 
    HashMap<String,Product> productList = Product.getList(); 
    HashMap<String,Product> sortedList = new HashMap<String, Product>(); 
    int[] positions = new int[productList.size()]; 
    int i = 0; 
    for(String id :productList.keySet()){ 
     Product p = productList.get(id); 
     positions[i] = p.getPosition(); 
     i++; 
    } 

    Arrays.sort(positions); 
    while(sortedList.size() < productList.size()) { 
     for (Integer position : positions) { 
      for (String id : productList.keySet()){ 
       Product p = productList.get(id); 
       if (p.getPosition().equals(position)) { 
        sortedList.put(id, p); 
       } 
      } 
     } 
    } 
    return sortedList; 
} 

public static Product[] getListAsArray(){ 
    Product[] p = new Product[productList.size()]; 
    int i = 0; 
    for(Product product : productList.values()){ 
     p[i] = product; 
     i++; 
    } 
    return p; 
} 

private void create(Init init){ 
    try { 
     DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
     domFactory.setIgnoringComments(true); 
     DocumentBuilder builder = domFactory.newDocumentBuilder(); 
     Document store = builder.parse(new File(init.PATH)); 
     Element pl = store.getElementById("productList"); 
     Element product = store.createElement("product"); 
     Text name = store.createTextNode(this.name); 
     Text id = store.createTextNode(this.id + ""); 
     Element productName = store.createElement("name"); 
     productName.appendChild(name); 
     product.setAttribute("productId",(this.id + "")); 
     product.setIdAttribute("productId",true); 
     product.setAttribute("position",this.position + ""); 
     product.appendChild(productName); 
     pl.appendChild(product); 

     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer t = tf.newTransformer(); 
     t.setOutputProperty(OutputKeys.INDENT, "yes"); 
     t.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); 
     DOMSource domSource = new DOMSource(store); 
     StreamResult sr = new StreamResult(new File(init.PATH)); 
     t.transform(domSource,sr); 
     Log.i("PRODUCT","created"); 

     Product.toList(this); 
     /** 
     * @Important the string in index of has to be the same as one of the headres in class Init.java 
     * */ 
     init.getListAdapter().update("PafElements",this.getName()); 

    }catch(ParserConfigurationException | TransformerException | SAXException | IOException e){ 
     e.printStackTrace(); 
     // TODO: 08.02.2017 use own logger class 
    } 
} 

private static void updatePosition(Integer current){ 
    if(maxPostition != null) { 
     if (current > maxPostition) { 
      maxPostition = current; 
     } 
    }else{ 
     maxPostition = current; 
    } 
} 

private static Integer getNextPosition(){ 
    Integer pos = maxPostition; 
    if(pos == null){ 
     pos = 1; 
    }else{ 
     pos += 1; 
    } 
    maxPostition = pos; 
    return pos; 
} 

答えて

0

ハッシュマップは、オブジェクトをマップに配置するクラスでequalsとhashcodeをオーバーライドすることによって機能します。 HashMapは高速で複雑な複雑さを持つオブジェクトを取り出すことができますが、それらは常に順序付けされていません。

明らかに必要なのは、ツリーマップです。 TreeMapは、ソートされたキー値リストです。 あなたのクラスはComparableを実装する必要があり、あなたの製品の比較のためのロジックを書く必要があります。あるいは、TreeMapに入れるComparatorを使用することもできます。 TreeMapDifference between HashMap and TreeMap well explained

関連する問題