我有PHP代码,我正在将它翻译成Java,但是我们如何使用Java进行像explode(),list(),foreach()这样的PHP?以下PHP代码是我的示例问题:
1. PHP:
/**
* @return: Array
*/
public function parse($digest)
{
$array = array();
$parts = explode(", ", $digest);
foreach ($parts as $x)
{
$bits = explode("=", $x);
$data[$bits[0]] = str_replace('"','', $bits[1]);
}
return $array;
}
Java (updated):
private String[] parse(String digest)
{
Map<String,String> array = new HashMap<String, String>();
String[] parts = digest.split(", ");
for (String x:parts)
{
String[] bits = x.split("=");
array.put(bits[0], bits[1].replace( '"','' )); // later will apply regex
}
return array; // incompatible types
}
2. PHP:
/**
* @return: String
*/
public function response($text, $user, $pass, $httpmethod, $uri)
{
list($dummy_digest, $value) = split(' ', $text, 2);
$x = $this->parse($value);
$realm = $x['realm'];
if ($x['qop'] == 'auth')
{
...
}
$base = "{$realm}, {$x['realm']}";
//"Digest username="1", realm="1", nonce="xxxxxx", uri="abc", response="abc", qop="auth", algorithm="MD5", cnonce="", nc="1"";
return $base;
}
Java problem:
public String response(String text, String user, String pass, String httpmethod, String uri)
{
// how to do such list() like php?
return "Digest username="1", realm="1", nonce="xxxxxx", uri="abc", response="abc", qop="auth", algorithm="MD5", cnonce="", nc="1"";
}
答案 0 :(得分:3)
爆炸 - StringUtils.splitPreserveAllTokens(String str,char separatorChar)
foreach只是用不同的方式写的 - for(String s:array)我认为Java中没有任何等效的列表,我认为不可能写一个,因为Java中的所有变量都是“按值传递”。
答案 1 :(得分:3)
与java完全相同,您可以使用以下方法解析数据:
Map<String, String> key_map = new HashMap<String, String>();
String[] parts_of_string = "var=test, var2=test2".split(", ");
for(String part : parts_of_string) {
String[] key_and_value_parts = part.split("=");
key_map.put(key_and_value_parts[0], key_and_value_parts[1]);
System.out.println(key_and_value_parts[0] + " <-> " + key_and_value_parts[1]);
}
更新(第二种方法):
Java不像PHP那样处理数组。 php可以通过使用类似$ array [“my_var”]的字符串来引用数组中的对象,但Java只能通过它们在数组中的索引来引用。因此,您需要使用地图,这允许您将某个键映射到值。您可以像这样解析文本:
private static Map<String, String> parse(String digest) {
String[] parts = digest.split(", ");
Map<String, String> map = new HashMap<String, String>();
for (String x : parts) {
String[] bits = x.split("=");
//Remove "'s here if you want to keep them in the string
map.put(bits[0], bits[1]);
}
return map;
}
然后,您可以使用方法get on来访问此地图提供的任何信息。然后,您将指定所需的密钥,地图将返回与该密钥关联的值。请务必使用.containsKey来检查Ma是否包含您要查找的密钥。
因此,当您使用上一个函数解析信息时,您可以使用此函数访问这些值,例如:
Map<String, String> parsed_map = parse("A realm=\"1234\", B=\"3434df323423423\", C=\"300.00\", D=\"loopback\"'");
String info = parsed_map.get("B");
System.out.println(info);
希望有所帮助,否则请求:D
PS:我实际上没有对此进行测试,请务必检查它是否按预期运行。
答案 2 :(得分:1)
foreach()
(就像示例)clone()
方法(使用深度克隆 - 原型设计模式)
public class Order {
private List<Item> items = new ArrayList<Item>();
public Order clone() {
Order newOrder = new Order();
for (Item originalItem : this.items) {
Item newItem = new Item();
newItem.setPrice(originalItem.getPrice());
newOrder.items.add(newItem);
}
return newOrder;
}
现在应该真的很清楚,如何使用foreach, 希望它有所帮助