Java, как реализовать массивы хэшей в Perl? - PullRequest
2 голосов
/ 29 апреля 2011

У меня хороший опыт работы со структурами данных Perl, и я начинаю с Java (на Android). Мне нужно реализовать что-то вроде этих структур данных Perl:

$beacons = (
 {
   ssid => "north",
   bssid => "01:02:03:04:05:06",
 },
 {
   ssid => "east",
   bssid => "02:03:04:05:06:07",
 },
 {
   ssid => "south",
   bssid => "03:04:05:06:07:08",
 },
 {
   ssid => "west",
   bssid => "04:05:06:07:08:09",
 },
);

$points = (
 {
  id => "La Gioconda",
  rssi => {
   north => -55,
   east => -76,
   south => -64,
   west => -92,
  },
 },
 {
  id => "La Pietà",
  rssi => {
   north => -51,
   east => -60,
   south => -88,
   west => -59,
  },
 },
 ...
);

Это статические структуры (в конечном итоге считываемые из файла xml на диске).

Если это может быть полезным, я внедряю местную (внутреннюю) систему позиционирования, используя изменение значений rssi (уровня сигнала) от 4 маяков Wi-Fi, расположенных в 4 углах каждой комнаты музея, для найти положение смартфона. Во время выполнения мне нужно будет сравнить 4 значения rssi (каждое из маяка с определенным ssid и bssid) со всей структурой моих точек и найти наиболее близкое к моим значениям.

Какая конструкция лучше всего доступна в Java? Должен ли я использовать HashMaps? Можете привести пример?

Ответы [ 4 ]

3 голосов
/ 29 апреля 2011

Подход 1:
Вы можете использовать Hashmaps для достижения своей цели.

Map<String,String> beacons = new HashMap<String,String>();
beacons.put("ssid","north");
beacons.put("bssid","01:02:03:04:05:06");
System.out.println(beacons.get("ssid")); // Outputs "north"

Подход 2:
Если ваши данные поступают из XML-файла, вы можете использовать JAXB API (Java XML Binding) для построения ваших объектов.

Допустим, у нас есть следующий XML-файл: beacons.xml

<beacons>
   <beacon ssid="north">
      <bssid>01:02:03:04:05:06</bssid>
   </beacon>
   <beacon ssid="north">
      <bssid>02:03:04:05:06:07</bssid>
   </beacon>
</beacons>

Классы могут быть определены так:

beacons.java

package com.mycompany;

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Beacons {
    @XmlElement(name = "beacon")
    public List<Beacon> beaconsList = new ArrayList<Beacon>();
}

beacon.java

package com.mycompany;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Beacon {
    @XmlAttribute
    private String ssid;
    @XmlElement
    private String bssid;

    public String getSsid() {
        return ssid;
    }

    public String getBssid() {
        return bssid;
    }
}

Пример кода для загрузки классов:

package com.mycompany;
import java.io.File;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;

public class Main {

    public static void main(String args[]) {
        try {
            JAXBContext jc = JAXBContext.newInstance(Beacons.class);
            Unmarshaller unmarshaller = jc.createUnmarshaller();

            Beacons myBeacons = (Beacons) unmarshaller.unmarshal(new File("beacons.xml"));

            List<Beacon> beaconsList = myBeacons.beaconsList;
            for (int i = 0; i < beaconsList.size(); i++) {
                Beacon a_beacon = beaconsList.get(i);
                System.out.println("Beacon " + (i+1));
                System.out.println("SSID   : " + a_beacon.getSsid());
                System.out.println("BSSID  : " + a_beacon.getBssid());
                System.out.println();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

-

Вот вывод:


Beacon 1
SSID   : north
BSSID  : 01:02:03:04:05:06

Beacon 2
SSID   : north
BSSID  : 02:03:04:05:06:07
1 голос
/ 29 апреля 2011

Простые объекты значения:

public class Beacon {
    private String ssid;
    private String bssid;

    public Beacon(String ssid, String bssid) {
        this.ssid = ssid;
        this.bssid = bssid;
    }

    public String getSsid() {
        return ssid;
    }

    public String getBssid() {
        return bssid;
    }
}

public class Point {
    private String id;
    private Rssi rssi;

    public Point(String id, Rssi rssi) {
        this.id = id;
        this.rssi = rssi;
    }

    public String getId() {
        return id;
    }

    public Rssi getRssi() {
        return rssi;
    }
}

public class Rssi {
    private int north;
    private int east;
    private int south;
    private int west;

    public Rssi(int north, int east, int south, int west) {
        this.north = north;
        this.east = east;
        this.south = south;
        this.west = west;
    }

    public int getNorth() {
        return north;
    }

    public int getEast() {
        return east;
    }

    public int getSouth() {
        return south;
    }

    public int getWest() {
        return west;
    }
}
1 голос
/ 29 апреля 2011

Какая конструкция лучше всего доступна в Java?

Зачем вообще использовать универсальные контейнеры, если ваши данные хорошо структурированы?

Ваш код будет более эффективным, есливы заключаете эти четко определенные структуры в их собственные классы Java.

Для реализации этих классов, конечно, потребуется код, но последующее использование структур будет намного проще без использованияПринадлежности в стиле hash.get(key) и hash.put(key, value).

0 голосов
/ 29 апреля 2011
private static final Map<String, String> BEACONS = new HashMap<String, String>();
beacons.put("north", "01:02:03:04:05:06");
...

private означает здесь, что ни одна сущность вместо вашего класса не сможет увидеть эту Карту. static означает, что он создается один раз для этого класса, а не каждый раз, когда создается объект. Кроме того, Java Naming Conventions предполагает, что вы называете константы в верхнем регистре.

Подробнее здесь о HashMaps.

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