Вы должны попытаться разделить свои данные, чтобы ускорить поиск. Дерево strcuture позволит вам найти очень быстро, если данные присутствуют или нет.
Например, начните с простой карты, которая связывает первую букву со всеми клавишами, начинающимися с этой буквы, таким образом, вы 't нужно искать все ключи, но только их меньшую часть.
Это будет выглядеть так:
ids = {}
for id in open(idfile):
ids.setdefault(id[0], set()).add(id)
for line in sys.stdin:
id=line.strip()
if id in ids.get(id[0], set()):
#print fastq
print id
#update ids
ids[id[0]].remove( id )
Создание будет немного медленнее, но поиск должен быть намного быстрее (Я ожидал бы в 20 раз быстрее, если бы символ fisrt ваших ключей был хорошо распределен, а не всегда один и тот же).
Это первый шаг, вы можете сделать то же самое со вторым символом, и так на, поиск будет просто ходить по дереву с каждой буквы ...
Для вышеупомянутого образца XML вы можете попробовать приведенный ниже синтаксический анализатор
public class MainActivity extends Activity {
ArrayList<String> r_no;
int count;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
r_no = new ArrayList<String>();
try {
File file = new File("mnt/sdcard/yourxmlfile.xml");
InputStream is = new FileInputStream(file.getPath());
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new InputSource(is));
doc.getDocumentElement().normalize();
NodeList n = doc.getElementsByTagName("OKV");
for (int j = 0; j < n.getLength(); j++) {
Node node = n.item(j);
Element fstElmnt = (Element) node;
r_no.add(fstElmnt.getAttribute("r"));
}
} catch (Exception e) {
System.out.println("XML Pasing Excpetion = " + e);
}
}
}
Для получения дополнительной информации проверьте официальный документ
Существует три способа анализа XML в Android
DOM Parsers
SAX Parsers
XMLPullParser
Выполните следующие действия
Сначала добавьте разрешение READ_EXTERNAL_STORAGE
в свой файл манифеста
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Затем проверьте разрешение во время выполнения для Android зефир и выше
Потому что Начиная с Android 6.0 (уровень API) 23) пользователи предоставляют разрешения приложениям во время работы приложения, а не при установке приложения
blockquote>int grant = ContextCompat.checkSelfPermission(this, permission); if (grant != PackageManager.PERMISSION_GRANTED) { String[] permission_list = new String[1]; permission_list[0] = permission; ActivityCompat.requestPermissions(this, permission_list, 1); }
Затем выполните синтаксический анализ вашего xml
Вот пример кода с использованием [ 1154]
DOM Parsers
ОБРАЗЕЦ КОДА
Создать класс модели
blockquote>public class Model { String rValue, aValue, eValue, nValue, gValue, dValue, vValue, mValue, iValue; public String getrValue() { return rValue; } public void setrValue(String rValue) { this.rValue = rValue; } public String getaValue() { return aValue; } public void setaValue(String aValue) { this.aValue = aValue; } public String geteValue() { return eValue; } public void seteValue(String eValue) { this.eValue = eValue; } public String getnValue() { return nValue; } public void setnValue(String nValue) { this.nValue = nValue; } public String getgValue() { return gValue; } public void setgValue(String gValue) { this.gValue = gValue; } public String getdValue() { return dValue; } public void setdValue(String dValue) { this.dValue = dValue; } public String getvValue() { return vValue; } public void setvValue(String vValue) { this.vValue = vValue; } public String getmValue() { return mValue; } public void setmValue(String mValue) { this.mValue = mValue; } public String getiValue() { return iValue; } public void setiValue(String iValue) { this.iValue = iValue; } }
[1144 ] MainActivity codeblockquote>
public class MainActivity extends AppCompatActivity { List<Model> modelArrayList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // first check for runtime permission String permission = Manifest.permission.READ_EXTERNAL_STORAGE; int grant = ContextCompat.checkSelfPermission(this, permission); if (grant != PackageManager.PERMISSION_GRANTED) { String[] permission_list = new String[1]; permission_list[0] = permission; ActivityCompat.requestPermissions(this, permission_list, 1); }else { ParseXML(); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this, "READ_EXTERNAL_STORAGE permission granted", Toast.LENGTH_SHORT).show(); ParseXML(); } else { Toast.makeText(MainActivity.this, " READ_EXTERNAL_STORAGE permission not granted", Toast.LENGTH_SHORT).show(); } } } private void ParseXML() { File dir = Environment.getExternalStorageDirectory(); File yourFile = new File(dir, "test.xml"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder; try { dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(yourFile); doc.getDocumentElement().normalize(); Log.e("Root_element" , doc.getDocumentElement().getNodeName()); NodeList nodeList = doc.getElementsByTagName("OKV"); modelArrayList = new ArrayList<Model>(); for (int i = 0; i < nodeList.getLength(); i++) { Element element = (Element) nodeList.item(i); Model model = new Model(); model.setrValue(element.getAttribute("r")); model.setaValue(element.getAttribute("a")); model.setgValue(element.getAttribute("g" )); model.setmValue(element.getAttribute("m" )); model.seteValue(element.getAttribute("e" )); model.setdValue(element.getAttribute("d" )); model.setiValue(element.getAttribute("i")); model.setnValue(element.getAttribute("n" )); model.setvValue(element.getAttribute("v")); modelArrayList.add(model); } for (int i = 0; i < modelArrayList.size(); i++) { Log.e("DATA_VALUE", modelArrayList.get(i).getaValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getdValue()); Log.e("DATA_VALUE", modelArrayList.get(i).geteValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getnValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getvValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getgValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getrValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getiValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getmValue()); } } catch (SAXException | ParserConfigurationException | IOException e1) { e1.printStackTrace(); } } }
OUTPUT
01-19 13:23:39.545 15689-15689/neel.com.demo E/Root_element: OKV 01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: Address 01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: 14021996 01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: email 01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: My Name 01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: 1 01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: male 01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: 129120190116115414009 01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: imagelink 01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: 123456
для получения дополнительной информации, пожалуйста, проверьте ниже статью
blockquote> [ 1159]Android - XML Parser [1112 ] Android XML Parser - XMLPullParser Как читать XML-файл на Java (DOM Parser) Пример синтаксического анализатора Java SAX Как выполнить синтаксический анализ xml для класса java с представлением переработчика или в адаптере представления переработчика Анализ данных XML в приложениях для Android Разбор XML для Android с использованием DOM Parser Учебник по разбору XML для Android Обучение синтаксическому анализу XML Данные в вашем приложении для Android
ОБНОВЛЕНИЕ
import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import com.nbsp.materialfilepicker.MaterialFilePicker; import com.nbsp.materialfilepicker.ui.FilePickerActivity; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; public class MainActivity extends AppCompatActivity { List<Model> modelArrayList = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // first check for runtime permission String permission = Manifest.permission.READ_EXTERNAL_STORAGE; int grant = ContextCompat.checkSelfPermission(this, permission); if (grant != PackageManager.PERMISSION_GRANTED) { String[] permission_list = new String[1]; permission_list[0] = permission; ActivityCompat.requestPermissions(this, permission_list, 1); } else { pickFile(); } } private void pickFile() { new MaterialFilePicker() .withActivity(this) .withRequestCode(1) .withFilterDirectories(true) .withHiddenFiles(true) .start(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == RESULT_OK) { String filePath = data.getStringExtra(FilePickerActivity.RESULT_FILE_PATH); Log.e("FILE_PATH", filePath); ParseXML(filePath); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 1) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(MainActivity.this, "READ_EXTERNAL_STORAGE permission granted", Toast.LENGTH_SHORT).show(); pickFile(); } else { Toast.makeText(MainActivity.this, " READ_EXTERNAL_STORAGE permission not granted", Toast.LENGTH_SHORT).show(); } } } private void ParseXML(String path) { File yourFile = new File(path); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder; try { dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(yourFile); doc.getDocumentElement().normalize(); Log.e("Root_element", doc.getDocumentElement().getNodeName()); NodeList nodeList = doc.getElementsByTagName("OKV"); modelArrayList = new ArrayList<Model>(); for (int i = 0; i < nodeList.getLength(); i++) { Element element = (Element) nodeList.item(i); Model model = new Model(); model.setrValue(element.getAttribute("r")); model.setaValue(element.getAttribute("a")); model.setgValue(element.getAttribute("g")); model.setmValue(element.getAttribute("m")); model.seteValue(element.getAttribute("e")); model.setdValue(element.getAttribute("d")); model.setiValue(element.getAttribute("i")); model.setnValue(element.getAttribute("n")); model.setvValue(element.getAttribute("v")); modelArrayList.add(model); } for (int i = 0; i < modelArrayList.size(); i++) { Log.e("DATA_VALUE", modelArrayList.get(i).getaValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getdValue()); Log.e("DATA_VALUE", modelArrayList.get(i).geteValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getnValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getvValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getgValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getrValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getiValue()); Log.e("DATA_VALUE", modelArrayList.get(i).getmValue()); } } catch (SAXException | ParserConfigurationException | IOException e1) { e1.printStackTrace(); } } }
ПРИМЕЧАНИЕ для средства выбора файлов я использовал AndroidFileExplorer